【问题标题】:Why won't lxml strip section tags?为什么 lxml 不剥离部分标签?
【发布时间】:2015-01-28 14:45:12
【问题描述】:

我正在尝试使用 lxml 和 Python 解析一些 HTML。我想删除部分标签。 lxml 似乎能够删除我指定的所有其他标签,但不能删除部分标签。

例如

test_html = '<section> <header> Test header </header> <p> Test text </p> </section>'
to_parse_html = etree.fromstring(test_html)

etree.strip_tags(to_parse_html,'header')
etree.tostring(to_parse_html)

'<section>  Test header  <p> Test text </p> </section>'

etree.strip_tags(to_parse_html,'p')
etree.tostring(to_parse_html)
'<section>  Test header   Test text  </section>'

etree.strip_tags(to_parse_html,'section')
etree.tostring(to_parse_html)
'<section>  Test header   Test text  </section>'

为什么会这样?

【问题讨论】:

  • 也许不是因为&lt;section&gt;标签,而是因为&lt;section&gt;是顶级标签?

标签: python html lxml


【解决方案1】:

为什么会这样?

不是。 documention 表示以下内容:

请注意,这不会删除元素(或 ElementTree 根 元素),即使它匹配。它只会对待它的 后代。

所以:

>>> tree = etree.fromstring('<section> outer <section> inner </section> </section>')
>>> etree.strip_tags(tree, 'section')
>>> etree.tostring(tree)
'<section> outer  inner  </section>'

您看到的行为与&lt;section&gt; 标签无关,但事实上它恰好是您的sn-p 的最外层标签。因此,您问题的实际答案是“因为它是这样实现的”。

要删除最外层的标签:是否可以更改创建&lt;section&gt;...&lt;/section&gt; 的代码来执行此操作?如果没有,ElementDepthFirstIterator 可能会成功:

>>> tree = etree.fromstring('<section> outer <section> inner </section> </section>')
>>> for val in etree.ElementDepthFirstIterator(tree, tag=None, inclusive=False):
...  print(etree.tostring(val))

b'<section> inner </section> '

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2021-06-23
  • 2013-07-11
  • 1970-01-01
相关资源
最近更新 更多