为什么赢得lxml条带标签?

时间:2015-01-28 14:45:12

标签: python html lxml

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

e.g。

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

为什么会这样?

1 个答案:

答案 0 :(得分:2)

  

为什么会这样?

不是。 documention说明如下:

  

请注意,这不会删除元素(或ElementTree根目录   你传递的即使匹配也是如此。它只会对待它   后代。

所以:

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

您看到的行为与<section>标记无关,但事实上它恰好是您的代码段的最外层标记。因此,您的问题的实际答案是&#34;因为它以这种方式实施&#34;。

删除最外面的标记:是否可以更改创建<section>...</section>的代码来执行此操作?如果没有,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> '