使用xpath和cheerio获取元素

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

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

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

我的DOM通过fs模块加载(因为我有这个网页存储在本地):

 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模块的代码?

       

网上收集的解决方案 "使用xpath和cheerio获取元素"

看来你正在做更多的工作,那么你需要find所需的元素。 你能发布一个示例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) 

我写了这个代码,得到正确的元素在cheerio ,给一个xpath

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

 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()) 

是的,有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