如何使用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']