js中的XPath解析HTML / XML"/>
使用node.js中的XPath解析HTML / XML
我正在尝试编写XPath语句以获取表中每一行的内容,但是仅当每行的第二列未设置为“ TBA”时才如此。我正在处理的页面this page。我是使用XPath的新手。
我想出了以下语句,我已经设法通过在线XPath测试器成功测试了(或无论如何看起来都成功),但无法弄清楚如何在node.js中应用它。
//*[@id="body_column_left"]/div[4]/table/tbody/tr/[not(contains(./td[2], 'TBA'))]
这是我在下面的尝试,我尝试了各种变体,但是我什至无法将其验证为有效的XPath语句,结果我迷失在不太有用的堆栈跟踪中:
var fs = require('fs');
var xpath = require('xpath');
var parse5 = require('parse5');
var xmlser = require('xmlserializer');
var dom = require('xmldom').DOMParser;
var request = require('request');
var getHTML = function (url, callback) {
request(url, function (error, response, body) {
if (!error && response.statusCode == 200) {
return callback(body) // return the HTML
}
})
}
getHTML("/", function (html) {
var parser = new parse5.Parser();
var document = parser.parse(html.toString());
var xhtml = xmlser.serializeToString(document);
var doc = new dom().parseFromString(xhtml);
var select = xpath.useNamespaces({"x": ""});
var nodes = select("//x:*[@id=\"body_column_left\"]/div[4]/table/tbody/tr/[not(contains(./td[2], 'TBA'))]", doc);
console.log(nodes);
});
任何帮助将不胜感激!
回答如下:我最终使用cheerio
而不是xpath
解决了此问题:
见下文:
var $ = cheerio.load(html);
$('.s_grad br').replaceWith("\n");
$('.s_grad thead').remove();
$('.s_grad tr').each(function(i, elem) {
rows[i] = $(this).text();
rows[i] = rows[i].replace(/^\s*[\r\n]/gm, ""); // remove empty newlines
matches.push(new match($(this).find('a').attr('href').substring(7).slice(0, -1))) // create matches
});
更多推荐
使用node.js中的XPath解析HTML / XML
发布评论