在动态元素内部剪切文本,没有id,类,属性等

时间:2014-05-11 23:35:53

标签: javascript html web-scraping casperjs

我唯一得到的就是前面的<td>将始终具有相同的(并且是文档中唯一的)内容:

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

我可以在浏览器控制台中轻松地使用jQuery抓取它(该页面加载了jQuery):

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

我已经有一段时间了,并尝试了我能想到的一切。

我最近的尝试是使用casperjs&#39;评估和:

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:找不到元素匹配选择器: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);
});  

问题仍然存在。请参阅下面的答案以获得解决方案。

2 个答案:

答案 0 :(得分:2)

如果您已经在链接的答案中尝试过,为什么不复制它?您的错误是您在thenEvaluate块中使用then。 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);
});

答案 1 :(得分:0)

我终于解决了。当我在浏览器中访问该页面时,我点击一个链接,javascript通过ajax POST调用一个模态,其中包含我正在抓取的信息。我认为在casperjs中,当我使用时,它会以相同的方式工作:

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

看起来casper的呈现方式与我预期的略有不同。即使主页面加载了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();