2014-05-11 40 views
0

我有去我的唯一的事情是,前面的<td>將始終具有相同的(和獨特的文檔)內容:刮動態文本元素中沒有ID,等級,屬性等

<td> 
    <label>unique text<label> 
</td> 
<td>dynamic text</td> 

我可以很容易地用jQuery抓住它在瀏覽器控制檯(在頁面加載的jQuery):

$("label:contains('unique text')").parent().next().text(); 

我一直在這一段時間,並已嘗試一切我能想到的。

我最近的嘗試是使用casperjs'評估和:

casper.thenEvaluate(function addID() { 
    $("label:contains('unique text')").parent().next().attr('id', 'uniqueID'); 
}); 
casper.then(function getText() { 
    var target = this.getHTML('td#uniqueID'); 
    this.echo(target); 
}); 

這給了我:

CasperError: No element matching selector found: td#uniqueID

爲什麼我casper.thenEvaluate功能沒有創造我正在尋找的td#uniqueID

如果我這樣做this post's answer

casper.then(function getText() { 
    this.evaluate(function addID() { 
     $("label:contains('unique text')").parent().next().attr('id', 'uniqueID'); 
    }); 
    var target = this.thenEvaluate(function returnText() { 
     return $('#uniqueID').text(); 
    }); 
    this.echo(target); 
}); 

我得到一個[Object Casper]這似乎正是它聽起來像。它充滿了waitForContentscrollTo等..

注:上面的代碼塊是不正確的(as was pointed out in this answer by Artjom B.)並更改爲此:

casper.then(function getText() { 
    this.evaluate(function addID() { 
     $("label:contains('unique text')").parent().next().attr('id', 'uniqueID'); 
    }); 
    var target = this.fetchText('#uniqueID'); 
    this.echo(target); 
}); 

的問題仍然存在。請參閱下面的答案以獲得解決方案。

回答

0

我終於得到了解決。當我在瀏覽器中訪問該頁面時,我點擊了一個鏈接,javascript通過ajax POST調用了我正在抓取的信息的模式。我以爲,在casperjs,它的工作時,我用同樣的方法:

casper.thenOpen('http://www.website.net/details.php', { 
    method: 'post', 
    data: { 
     'id': 'foo', 
     'key': 'bar', 
    } 
}); 

看起來卡斯帕呈現此略有不同,比我的預期。即使主頁面已經加載了jQuery,模式也沒有。所以,我需要:

clientScripts: ["jquery-2.1.1.min.js"] 

裏面我:

var casper = require('casper').create({ 

}); 

(casperjs docs on jQuery)

下面是引用完整的腳本:

var url = "http://www.website.net/search.php?key=foobarfoobarfoobarfoobar"; 

var casper = require('casper').create({ 
    clientScripts: ["jquery-2.1.1.min.js"] 
}); 

casper.start(url, function() { 
    //some other unrelated stuff is going to go here 
}); 

casper.thenOpen('http://www.website.net/details.php', { 
    method: 'post', 
    data: { 
     'id': 'foo', 
     'key': 'bar', 
    } 
}); 

casper.then(function getText() { 
    this.evaluate(function addID() { 
     $("label:contains('unique text')").parent().next().attr('id', 'uniqueID'); 
    }); 
    var target = this.fetchText('#uniqueID'); 
    this.echo(target); 
}); 

casper.run(); 
2

如果您已經在鏈接的答案中嘗試過它,爲什麼不直接複製呢?您的錯誤是您在then區塊內使用thenEvaluate。 CasperJS在步驟中工作,並且您安排了一個不必要的步驟。這將創建另一個稍後執行的步驟。

thenEvaluate更改爲evaluate它應該可以正常工作。當你在它,你可以將二者結合起來:

casper.then(function getText() { 
    var target = this.evaluate(function addID() { 
     $("label:contains('unique text')").parent().next().attr('id', 'uniqueID'); 
     return $('#uniqueID').text(); 
    }); 
    this.echo(target); 
}); 

甚至

casper.then(function getText() { 
    this.evaluate(function addID() { 
     $("label:contains('unique text')").parent().next().attr('id', 'uniqueID'); 
    }); 
    var target = this.fetchText(#uniqueID); 
    this.echo(target); 
}); 
+0

非常感謝您對這個問題,我其實是有試了99種不同的方式(包括這樣的^),但我不知道哪種方式是正確的,我只有k無論如何,我最終都會得到同樣的結果。我會更新我原來的帖子,以反映正確的方式來調用這些。 –

+0

您應該**不**編輯您的答案以用有效代碼替換錯誤的代碼,因爲具有相同問題的下一個用戶可能不明白問題及解決方法。 –

+0

我很抱歉,這是比實際問題更多的錯誤,所以我認爲最好清除代碼。我會編輯它以包含兩者。 –