如何在 Python 中使用 lxml 更改 XML 命名空间?

How to change XML namespace with lxml in Python?

我有一个如下所示的 XML 文件,我已经用 lxml 将它解析为 Tree。 我想要做的是将 xml 声明从 xmlns="http://www.w3.org/TR/html4/" 更改为 xmlns="http://www.w3.org/TR/html5/".

<table xmlns="http://www.w3.org/TR/html4/">
  <tr>
      <td>Apples</td>
      <td>Bananas</td>
  </tr> 
</table>

但我未能获得 xmlns 属性或通过设置 tag 属性 更改它。任何帮助,谢谢。

我认为您可以找到 table 元素并通过 .attrib 字典重新设置访问 xmlns 属性的属性值:

In [1]: from lxml import html

In [2]: data = """<html><body><table xmlns="http://www.w3.org/TR/html4/">
    ...:   <tr>
    ...:       <td>Apples</td>
    ...:       <td>Bananas</td>
    ...:   </tr>
    ...: </table></body></html>"""

In [3]: root = html.fromstring(data)

In [4]: root.find('.//table').attrib['xmlns'] = "http://www.w3.org/TR/html5/"

In [5]: print(html.tostring(root, encoding='unicode', pretty_print=True))
<html><body><table xmlns="http://www.w3.org/TR/html5/">
  <tr>
      <td>Apples</td>
      <td>Bananas</td>
  </tr>
</table></body></html>

我实际上建议使用 BeautifulSoup 对 html 结构进行此类更改:

from bs4 import BeautifulSoup
t = """
<table xmlns="http://www.w3.org/TR/html4/">
 <tr>
     <td>Apples</td>
     <td>Bananas</td>
 </tr>
</table>
"""
soup = BeautifulSoup(t, 'lxml')
soup.table['xmlns'] = 'http://www.w3.org/TR/html5/'
print(soup)

应该return:

<html><body><table xmlns="http://www.w3.org/TR/html5/">
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
</body></html>

我们仍在使用 lxml 但在 BeautifulSoup