如何使用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()
我得到的是文本和lxml元素的混合!比如something something <Element a at 0x102ac2140> something
。
有没有办法用纯粹的XPath查询来获取<font>
节点的内容,或者强制lxml返回一个字符串,而不是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 个回答
有没有办法用纯粹的XPath查询来获取
<font>
节点的内容,或者强制lxml返回一个字符串,而不是lxml对象呢?注意,我从XPath查询中返回的是很多节点的列表,所以解决方案需要支持这一点。
为了更清楚一点……我想从类似下面的内容中返回
<a href="url">inside</a>
的东西……<font face="verdana" color="#ffffff" size="2"><a
href="url">inside something
简短回答: 不可以。
XPath不是在“标签”上工作,而是在节点上
被选中的节点在使用XPath的语言中被表示为特定对象的实例。
如果你需要某个节点的标记的字符串表示,这些对象通常支持一个outerXML
属性——可以查看使用的语言的文档(在这个例子中是lxml)。
正如@Robert-Rossney在他的评论中指出的:lxml的tostring()
方法相当于其他环境中的outerXml
属性。
我不太明白你的意思——这是不是接近你想要的内容呢?
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']