6

尝试在 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存储为此数学元素。然后我继续挖掘新的 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 模块帮助我编写代码吗?

4

2 回答 2

7

看起来您正在做更多的工作,然后您需要找到所需的元素。你能发布一个示例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)
于 2013-04-15T12:47:57.493 回答
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

于 2014-12-03T16:58:45.940 回答