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

时间:2017-12-21 03:39:40

标签: python lxml xml-namespaces

我有一个像下面这样的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属性来更改它。任何帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

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

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>

答案 1 :(得分:0)

我实际上建议使用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)

它应该返回:

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

我们仍在使用lxml但在BeautifulSoup