2013-04-15 122 views
5

试图在node.js中编写一个函数,该函数将通过xpath获取元素。使用xpath和cheerio获取元素

我具有所需的DOM元素的像

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

我的DOM装入cheerio的XPath通过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模块的代码?

回答

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) 
+0

我没有实现你的方法,我被困在获取时,例如,第三个元素,当xpath的部分就像'../ div [3]/...'。我使用这里粘贴的代码http://pastebin.com/pzSYz6Zc错误也被粘贴。 – Astro

+0

没有任何示例html很难给你提供建议。请发布示例html页面 – Noah

+0

没有html页面,它是从node.js代码 – Astro

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

虽然它看起来不像符合W3C的XPath实现。 –

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

+1

不幸的是,示例(xmldom)中使用的DOM解析器非常严格,并且不适用于真正的HTML页面。 当时我还没有找到兼容xpath的原谅DOM解析器。 –