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


问题内容

我正在使用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()

如果混合使用text和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>

问题答案:

我不确定我是否了解-这是否接近您的需求?

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']