2013-04-15 120 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解析器。 –