如何使用xpath和lxml获取节点的完整内容?

5 投票
2 回答
4651 浏览
提问于 2025-04-16 06:40

我正在使用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 个回答

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属性

3

我不太明白你的意思——这是不是接近你想要的内容呢?

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

撰写回答