2010-11-06 155 views
3

我使用lxml的xpath函數來檢索網頁的某些部分。我試圖獲得一個<font>標籤的內容,其中包含自己的html標籤。如果我使用如何使用xpath&lxml獲取節點的完整內容?

//td[@valign="top"]/p[1]/font[@face="verdana" and @color="#ffffff" and @size="2"] 

我得到節點適量,但他們返回LXML對象(<Element font at 0x101fe5eb0>)。

如果我使用

//td[@valign="top"]/p[1]/font[@face="verdana" and @color="#ffffff" and @size="2"]/text() 

我得到我想要的東西,但我沒有得到任何這是包含在<font>節點中的HTML代碼。

如果我使用

//td[@valign="top"]/p[1]/font[@face="verdana" and @color="#ffffff" and @size="2"]/node() 

如果得到的文本和LXML元素的混合物! (例如something something <Element a at 0x102ac2140> something

反正是有使用純XPath查詢得到<font>節點的內容,甚至迫使LXML從.xpath()方法,而不是lxml的對象返回的內容的字符串?

請注意,我從XPath查詢中返回了許多節點的列表,因此解決方案需要支持該節點。

只是爲了澄清...我想從像回到something something <a href="url">inside</a> something ...

<font face="verdana" color="#ffffff" size="2"><a href="url">inside</a> something</font> 
+0

好問題,+1。請參閱我的答案以獲得解釋。 – 2010-11-06 19:29:42

回答

2

我不確定我是否理解 - 這是否接近您要查找的內容?

import lxml.etree as le 
import cStringIO 
content='''\ 
<font face="verdana" color="#ffffff" size="2"><a href="url">inside</a> something</font> 
''' 
doc=le.parse(cStringIO.StringIO(content)) 

xpath='//font[@face="verdana" and @color="#ffffff" and @size="2"]/child::*' 
x=doc.xpath(xpath) 
print(map(le.tostring,x)) 
# ['<a href="url">inside</a> something'] 
+0

很好,謝謝。 – significance 2010-11-07 09:53:36

2

反正是有使用純的XPath查詢 拿到 <font>節點的內容,甚至強制lxml 從.xpath()方法返回一個內容爲 的字符串,而不是一個lxml對象的 ?

請注意,我從XPath查詢中返回了許多 節點的列表,因此 解決方案需要支持該節點。

只是爲了澄清...我想從 像回到 什麼東西<a href="url">inside</a> something ...

<font face="verdana" color="#ffffff" size="2"><a 

HREF = 「URL」>裏面的東西

簡答 :編號

XPath在「標籤」上不起作用,但與節點

所選節點表示爲託管XPath的語言中特定對象的實例。

如果您需要特定節點標記的字符串表示形式,此類對象通常支持outerXML屬性 - 請檢查託管語言(本例中爲lxml)的文檔。

作爲@羅伯特 - Rossney在他的評論中指出:LXML的tostring()方法等同於其他環境outerXml財產

+0

謝謝,在問題中改變了詞彙... lxml似乎不支持innerXML()或outerXML():( – significance 2010-11-06 19:45:34

+0

@significance:我也修改了我的答案:不,XPath不代表節點標記一個字符串形式 – 2010-11-06 20:13:34

+0

lxml的'tostring()'方法等同於其他環境的''outerXml'方法 – 2010-11-06 23:09:35