【问题标题】:Xpath extract current node content including all child nodeXpath 提取当前节点内容,包括所有子节点
【发布时间】:2015-04-27 05:05:41
【问题描述】:

我在提取当前节点内容(包括所有子节点)时遇到了问题。

就像下面的代码,我想获取字符串 abcdefg<b>b1b2b3</b> 在预标签中。

但我无法使用“child::*”来获取它。 如果我使用“/text()”,我会丢失 b 标签格式信息。请帮帮我。

# -*- coding: utf-8 -*-
from lxml import html
import lxml.etree as le

input = "<pre>abcdefg<b>b1b2b3</b></pre>"
input_xpath = "//pre/child::*"
tree = html.fromstring(input)
result = tree.xpath(input_xpath)
result1 = [le.tostring(item) for item in result]
result2 = ''.join(result1)
print result2

output: <b>b1b2b3</b>

【问题讨论】:

  • 这对我来说很难。我不知道lxml如何解决你的问题。
  • @TonyYang fyi,请查看下面的答案和链接的问题,了解解决此问题的可能选项

标签: python xpath lxml


【解决方案1】:

要获取 XML 节点的内容标记(有时称为 "innerXML"),您可以从选择节点开始(而不是选择子节点或文本内容):

from lxml import html
import lxml.etree as le

input = "<pre>abcdefg<b>b1b2b3</b></pre>"
tree = html.fromstring(input)
node = tree.xpath("//pre")[0]

然后将文本内容与所有子节点标记结合起来:

result = node.text + ''.join(le.tostring(e) for e in node)
print result

输出:

abcdefg<b>b1b2b3</b>

【讨论】:

  • 我认为这不是一个好的答案。如果输入的是字符串的“
    b1b2b3abcdefg
    ”,你会怎么做?
  • 你会用result = ''.join(le.tostring(e) for e in node) + node.text回答我吗?
  • @TonyYang 令人惊讶的是,代码几乎也适用于这种情况。在这种情况下,唯一的问题是 node.Text return None 所以它不能与字符串组合。添加None 检查对我来说产生了预期的结果:node.text if node.text else '' + ''.join(le.tostring(e) for e in node)
【解决方案2】:

尝试将您的 xpath 替换为以下内容

In [0]: input = "<pre>abcdefg<b>b1b2b3</b></pre>"

In [1]: input_xpath = "//pre//text()"

In [2]: tree = html.fromstring(input)

In [3]: result = tree.xpath(input_xpath)

In [4]: result
Out[5]: ['abcdefg', 'b1b2b3']

【讨论】:

  • 其实这不是我想要的。因为b1b2b3丢失了标签信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
相关资源
最近更新 更多