最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

使用node.js中的XPath解析HTMLXML

网站源码admin21浏览0评论

使用node.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
    });
发布评论

评论列表(0)

  1. 暂无评论