【问题标题】:how to get the full contents of a node using xpath & lxml?如何使用 xpath & lxml 获取节点的全部内容?
【发布时间】:2011-05-06 02:38:56
【问题描述】:

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

【问题讨论】:

  • 好问题,+1。请参阅我的答案以获得解释。

标签: python html lxml xpath


【解决方案1】:

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

请注意,我返回了许多列表 XPath 查询中的节点,因此 解决方案需要支持这一点。

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

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

href="url">里面的东西

简答:不。

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

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

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

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

【讨论】:

  • 谢谢,已更改问题中的词汇... lxml 似乎不支持 innerXML() 或 outerXML() :(
  • @significance:我也修改了答案:不,XPath 不代表字符串形式的节点标记。
  • lxml 的tostring() 方法等价于其他环境的outerXml 方法。
  • @Robert-Rossney:谢谢,我在答案中添加了这些信息。
【解决方案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']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-09
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 2011-09-23
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多