我一直在与CasperJS合作进行我正在进行的网络抓取项目,并且在使其完美运行方面遇到了一些麻烦。
getElementsAttribute
作为一种从表中捕获href
和title
信息的方法一直很好,但在某些情况下,这些表没有超链接,但需要无论如何都要被刮掉。这是代码的开头部分:
// 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相同大小/顺序的数组中。似乎应该有一个简单的方法来做到这一点,但我无法弄明白。有人能指出我正确的方向吗?
答案 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
}