如何使用xpath&获取节点的全部内容限于lxml?

时间:2010-11-06 19:19:51

标签: python html lxml xpath

我正在使用lxml的xpath函数来检索网页的各个部分。我正在尝试获取<font>标记的内容,其中包含自己的html标记。如果我使用

//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>

2 个答案:

答案 0 :(得分:2)

  

无论如何都要使用纯XPath   查询获取的内容   <font>个节点,甚至强制lxml   返回一串内容   而是来自.xpath()方法   而不是一个lxml对象?

     

请注意,我正在返回许多列表   来自XPath查询的节点所以   解决方案需要支持。

     

只是为了澄清......我想回来   来自<a href="url">inside</a> something的东西   类似......

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

href =“url”&gt;内容

简短回答:否。

XPath不适用于“标记”,但使用节点

所选节点表示为托管XPath的语言中特定对象的实例。

如果您需要特定节点标记的字符串表示,此类对象通常支持outerXML属性 - 请检查托管语言的文档(在本例中为lxml)。

正如@ Robert-Rossney在评论中指出的那样:lxml的tostring()方法等同于其他环境'outerXml属性

答案 1 :(得分: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']