lxml:如何摆脱名称空间?

时间:2019-05-08 20:18:02

标签: python xml lxml xml-namespaces

这个最小的XHTML片段:

<html xmlns="http://www.w3.org/1999/xhtml">
  <head><title>Title</title>
  </head>
  <body>
    <h1>Subtitle</h1>
  </body>
</html>

使用lxml处理以下内容时:

from lxml import etree

root = etree.fromstring('''\
<html xmlns="http://www.w3.org/1999/xhtml">
  <head><title>Title</title>
  </head>
  <body>
    <h1>Subtitle</h1>
  </body>
</html>
''')

for e in root.iter():
    print(e.tag)

产生以下结果:

{http://www.w3.org/1999/xhtml}html
{http://www.w3.org/1999/xhtml}head
{http://www.w3.org/1999/xhtml}title
{http://www.w3.org/1999/xhtml}body
{http://www.w3.org/1999/xhtml}h1

即:它在 all 标记之前加上xmlns属性值为namespace

我可以理解这实际上是“正确的方法”,但这也是真正的PITA,尤其是当您需要大量使用XPath时(除非合适的{{1 }}随处可见)。

我还尝试使用以下内容:

namespaces="..."

但它似乎没有任何改变。

是否有某种方法可以摆脱这个(无用的!)命名空间(当然,缺少编辑文件以删除parser = etree.XMLParser(ns_clean=True, no_network=True, remove_comments=True, remove_pis=True) doc = etree.parse(fi, parser) 声明的权限)?

0 个答案:

没有答案