使用CasperJS在youtube评论中找到类似按钮的XPath

时间:2015-02-27 12:53:56

标签: xpath youtube web-scraping phantomjs casperjs

我是CasperJS的初学者,我喜欢用刮痧尝试新事物。我的问题:

我可以登录youtube并喜欢视频,但是我找不到像youtube一样的youtube评论的正确XPath。

http://tinypic.com/r/2vayr83/8

这是我坚持的部分,我总是得到错误:

wait timeout of 5000ms expired exiting- 

所以我猜这是因为XPath不正确而且我想在特定评论上这样做。我怎么能这样做?

casper.waitForSelector(x('//*[@id="update-z132gvlzosmchn30f225wng5gluzgbs5o04"]/div/div/div[1]/div[4]/div[3]/img'), function() {
  this.click('//*[@id="update-z132gvlzosmchn30f225wng5gluzgbs5o04"]/div/div/div[1]/div[4]/div[3]/img');

  this.capture('like.png')
  this.echo("liked");
});

1 个答案:

答案 0 :(得分:1)

Youtube评论主题是在iframe中加载的,因此您需要先在iframe中进行更改,然后才能在其中执行操作。您可以使用casper.withFrame()步骤功能执行此操作。请注意选择正确的iframe,因为有多个iframe。

另一件事是,几乎所有CasperJS函数默认只接受CSS选择器,但是对click使用XPath表达式。您必须使用CasperJS提供的XPath实用程序来告诉CasperJS传递的字符串包含XPath表达式而不是CSS选择器。

另一个问题可能是iframe只在滚动到视图后才会加载。您可能需要滚动到底部。 CasperJS提供scrollToBottom()功能来执行此操作。您还需要等到向下滚动后将iframe放入页面。

完整(未经测试)的脚本:

var casper = require('casper').create();
casper.start(url, function(){
    this.scrollToBottom();
    this.scrollToBottom();
});
casper.waitForSelector('.comments-iframe-container iframe', function(){});
casper.withFrame(1, function(){
  var link = '//*[@id="update-z132gvlzosmchn30f225wng5gluzgbs5o04"]/div/div/div[1]/div[4]/div[3]/img';
  this.waitForSelector(x(link), function() {
    this.click(x(link));
    this.wait(1000, function(){
      this.capture('like.png')
      this.echo("liked");
    });
  });
}).run();