【问题标题】:How to remove a node via lxml xpath?如何通过 lxml xpath 删除节点?
【发布时间】:2019-08-15 22:12:03
【问题描述】:

假设通过以下命令从标准输入加载了一个 html 文件。

from lxml import html
doc = html.parse(sys.stdin, parser = html.HTMLParser(encoding='utf-8'))

通过doc.xpath(..),我得到了一个<p> 节点(假设它保存在python 中的变量p 中),其中嵌套了一个<span> 节点。

<p><span class="level-4">blah1 blah2</span> blah3 blah4</p>

通过p.xpath('./span') 访问&lt;span&gt; 很容易。但我想将&lt;p&gt; 中剩余的内容转换为文本。因此,我想排除 xpath 匹配的内容(在本例中为 ./span)。

三种方法可以排除与 xpath 匹配的对象吗?谢谢。

【问题讨论】:

  • 所以你的预期输出是blah3 blah4?
  • 是的。就是这样。

标签: xpath lxml


【解决方案1】:

试试这个:

txt = """
<p><span class="level-4">blah1 blah2</span> blah3 blah4</p>
"""

from lxml.html import fragment_fromstring, tostring, etree
html = fragment_fromstring(txt)

etree.strip_elements(html, 'span', with_tail=False)
tostring(html)

输出:

<p> blah3 blah4</p>

【讨论】:

  • 当输入文本为&lt;p&gt;&lt;span class="level-4"&gt;blah1 blah2&lt;/span&gt; blah3&lt;span class="level-4"&gt; blah4&lt;/span&gt; blah5&lt;/p&gt;时,有没有办法只去掉第一个跨度。当第一个跨度之前有一些文本时,有没有办法不剥离任何东西?谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
相关资源
最近更新 更多