2012-05-02 41 views
1

文本中的XPath我希望在的Python LXML的XPath與特定搜索

...table/tbody/tr[4]/td[2] 

具體而言,以提取被可靠地位於樹深深嵌套,TD [2]的結構,像這樣

<td class="val">xyz</td> 

我想提取文本「xyz」,但廣泛的搜索返回多個結果。例如,以下路徑返回10個元素。

xpath('//td[@class="val"]') 

...而特定的搜索不返回任何元素。 我不確定爲什麼以下不返回任何內容。

xpath('//tbody/tr/td[@class="val"]') 

一種解決方案涉及..

table = root.xpath('//table[@class="123"]') 

#going down the tree 
xyz = table[0][3][1] 
print vol.text 

不過,我敢肯定這極脆。我將不勝感激,如果有人可以告訴我如何構造一個XPath搜索,這將是兩個非脆性和資源

+3

你可以只貼上一些有效的XML,以及進行測試,而不是給'...表/ tbody/...' –

+1

請提供一個示例XML文檔。如果它比10行更長,可以在[pastebin.com](http://pastebin.com)或[gist](https://gist.github.com/) – phihag

+1

上載,或者您可以修剪xml文檔,在python代碼中使用它並粘貼顯示問題的示例python代碼,我想複製粘貼並運行代碼並查看問題,例如類似於我的回答 –

回答

0

你還沒有明確提及,但如果你的目標tabletd標籤類是可靠的,那麼你可以這樣做:

//table[@class="123"]/descendant::td[@class="val"] 

你一半閃避tbody問題是有或沒有。

然而,有不可替代的真正看到你正在試圖解析爲推薦XPath查詢材料...

1

這似乎相對便宜的是工作

from lxml import etree 

doc = etree.HTML('<html><body><table><tbody><tr><td>bad</td><td class="val">xyz</td></tr></tbody></table></body></html>') 
print doc.xpath('//tbody/tr/td[@class="val"]')[0].text 

輸出:

xyz 

那麼你的問題是什麼?

2
...table/tbody/tr[4]/td[2] 

我想你通過類似Firebug的工具找到了這個XPath。關於Firebug(或瀏覽器中的其他檢測工具)的工具需要注意的一點是,它們使用由瀏覽器本身生成的DOM樹,並且瀏覽器中的大多數(如果不是全部)HTML解析器都會盡力使傳遞的HTML有效。這通常需要添加標準規定的各種標籤。

<tbody>就是其中之一。 <tr> tags are only allowed as a child of <thead>, <tbody> or <tfoot> tags.不幸的是,根據我的經驗,在實際源代碼中很少會看到<table>中的這些標記中的一個,但瀏覽器會在解析時添加這些必要標記,以使standard requires to do so以後的HTML成爲有效。

爲了簡化這個故事,您的實際來源中可能沒有<tbody>標記。這就是爲什麼你的XPath什麼都不返回。

至於生成XPath查詢,這高度依賴於特定的頁面/ xml。一般來說,像td[4]這樣的位置查詢應該是最後的選擇,因爲當它們之前添加了某些東西時,它們很容易中斷。您應仔細檢查標記,並嘗試使用像idclass這樣的屬性進行查詢,因爲它們比位置屬性更可靠。但最終,這一切都歸結爲相關頁面的細節。

+1

你可以加一點你的觀點:*源中沒有'tbody' * – MattH

+0

@MattH:好主意。會做。 – Avaris