在CasperJS中使用XPath捕获元素作为Javascript数组

时间:2014-02-24 22:36:35

标签: javascript xpath casperjs getelementsbytagname

我一直在与CasperJS合作进行我正在进行的网络抓取项目,并且在使其完美运行方面遇到了一些麻烦。

getElementsAttribute作为一种从表中捕获hreftitle信息的方法一直很好,但在某些情况下,这些表没有超链接,但需要无论如何都要被刮掉。这是代码的开头部分:

// Load utilities

var utils = require('utils');
var client = require('clientutils');
var fs = require('fs');
var x = require('casper').selectXPath;
var casper = require('casper').create({

pageSettings: {
    loadImages:  false,        
    loadPlugins: false 
},

clientScripts:  ['C:/casperjs/lib/jquery.min.js','C:/casperjs/lib/jquery.csv-0.71.min.js']

});

// Choose Main URL and Target Links

var mainURL = "http://en.wikipedia.org/wiki/Identification_badges_of_the_United_States_military";
var mainAttribute = '//*[@id="mw-content-text"]/ul/li/div/div/p/a';
var mainElement = '//*[@id="mw-content-text"]/ul/li/div/div/p';

casper.start();

casper.open(mainURL).then(function(){

// Choose Links from Main URL

mainLinks = this.getElementsAttribute(x(mainAttribute),'href');
mainTitle = this.getElementsAttribute(x(mainAttribute),'title');
mainFetch = document.getElementsByTagName(x(mainElement));

utils.dump(mainFetch);

});

casper.run();

getElementsAttribute为我提供了正确的信息,但getElementsByTagName只给我一个“未定义”或空的结果,即使我在里面播放内容也是如此。 (this.getElementsByTagName似乎不起作用。)

基本上我想在缺少超链接的实例中获取文本,并使用单个XPath选择器将其推入与mainLinks和mainTitle相同大小/顺序的数组中。似乎应该有一个简单的方法来做到这一点,但我无法弄明白。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用mainFetch = this.getElementsInfo(x(mainElement)); 正如你在下面的输出片段中看到的那样,它捕获了所有的孩子,而html部分可以用来过滤掉那些不以''开头的孩子。

{
    "attributes": {},
    "height": 54,
    "html": "<a href=\"/wiki/CPO_Command_Identification_Badge\" title=\"CPO Command Identification Badge\" class=\"mw-redirect\">Chief Petty Officer Command Identification Badges</a>",
    "nodeName": "p",
    "tag": "<p><a href=\"/wiki/CPO_Command_Identification_Badge\" title=\"CPO Command Identification Badge\" class=\"mw-redirect\">Chief Petty Officer Command Identification Badges</a></p>",
    "text": "Chief Petty Officer Command Identification Badges",
    "visible": true,
    "width": 147,
    "x": 185,
    "y": 9302
},
{
    "attributes": {},
    "height": 18,
    "html": "Law Enforcement Badges",
    "nodeName": "p",
    "tag": "<p>Law Enforcement Badges</p>",
    "text": "Law Enforcement Badges",
    "visible": true,
    "width": 147,
    "x": 185,
    "y": 9526
}