使用xpath和cheerio获取元素

时间:2013-04-15 08:16:09

标签: node.js cheerio

尝试在node.js中编写一个函数,该函数将通过xpath获取元素。

我有一个所需dom元素的xpath,如

xpath = '/html/body/div/div[2]/div/h1/span'

我的DOM通过fs模块加载到 cheerio (因为我在本地存储了此网页):

var file = fs.readFileSync( "aaa.html" )
var inDom    = cheerio.load( file )

然后我试图通过每个xpath部分进行迭代,获取dom树的元素,如果名称和元素编号匹配则检查它的子项,如果匹配,则存储 rez 作为此mathed元件。然后我继续挖掘新的xpath部分。代码看起来像这样,但它无法得到我想要的东西,因为在我得到第一个mach并将 rez 设置为匹配元素之后,在下一个for循环周期中,这个新元素似乎没有任何儿童元素。

var rez = inDom('html');
var xpath = inXpath.split( "/" );
for( var i = iterateStart; i < xpath.length; i++ ) {
    var selector = xpath[ i ].split('[')[0];
    var matches = xpath[ i ].match(/\[(.*?)\]/);
    var child = 0;
    if( matches ) {
        child = matches[ 1 ];
    }

    for( var k = 0; k < rez.length; k++ ) {
        var found = false
        var curE = rez[ k ]

        for( var p = 0; p < curE.children.length; p++ ) {
            var curE_child = curE.children[ p ]

            if( curE_child.name = selector ) {
                if( child > 0 ) {
                    child--
                }
                else {
                    rez = curE_child
                    found = true
                    break
                }
            }               
        }
        if( found ) {
            break
        }
    }       
}

任何人都可以使用提到的node.js模块帮助我处理代码吗?

3 个答案:

答案 0 :(得分:4)

您似乎正在做更多的工作,然后您需要找到所需的元素。你可以发一个示例html页面吗?

Cheerio提供了更高级别的api,用于查找您应该使用的元素。

var html = fs.readFileSync('aaa.html')
var $ = cheerio.load(html)
var selector = 'div' // some selector here which I can tune to the example html page
var parent = $(selector)
var childSelector = 'p' // some other selector 
var children = parent.find(childSelector)

答案 1 :(得分:0)

我已编写此代码,在cheerio中获取正确的元素,给定xpath

这仅适用于最基本的xpath,问题中提到的类型以及浏览器通常为元素提供的类型。

inXpath = "BODY/DIV[1]/DIV[2]/DIV[1]/DIV[1]/DIV[3]/DIV[1]/DIV[1]/DIV[3]/DIV[3]/DIV[1]/DIV[1]/DIV[1]/DIV[1]/SPAN[1]"
var xpath = inXpath.split( "/" );
var dom_body = cheerio.load(body);
sss = dom_body('*');
for( var i = 0; i < xpath.length; i++ ) {
    if (xpath[i].indexOf('[') == -1){
        sss = sss.children(xpath[i])
    } else {
        var selector = xpath[i].split('[')[0];
        var matches = xpath[i].match(/\[(.*?)\]/);
        var index = matches[1] - 1;
        sss = sss.children(selector).eq(index)
    }
}
console.log(sss.html().trim())

答案 2 :(得分:0)

是的,有xpath实现:

npm install xpath

样品:

var xml = "<book><title>Harry Potter</title></book>"
var doc = new dom().parseFromString(xml)
var title = xpath.select("//title/text()", doc).toString()
console.log(title)

来源:     https://www.npmjs.org/package/xpath