如何使用BeautifulSoup访问命名空间XML元素?

2024-10-01 07:43:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个XML文档,内容如下:

<xml>
<web:Web>
<web:Total>4000</web:Total>
<web:Offset>0</web:Offset>
</web:Web>
</xml>

我的问题是如何使用python中的BeautifulSoup这样的库访问它们?

xmlDom.web[“web”].Total?不起作用?


Tags: 文档web内容xmloffsettotalbeautifulsoupxmldom
3条回答

您应该使用xmlns:prefix="URI"语法(see examples here)在根元素上显式定义名称空间,然后从BeautifulSoup通过prefix:tag访问属性。请记住,您还应该明确定义什么,BeautifulSoup应该如何处理您的文档,在这种情况下:

xml = BeautifulSoup(xml_content, 'xml')

这是一个老问题,但有些人可能不知道,如果将'xml'作为第二个参数传递给构造函数,那么至少BeautifulSoup 4可以很好地处理名称空间:

soup = BeautifulSoup("""<xml>
<web:Web>
<web:Total>4000</web:Total>
<web:Offset>0</web:Offset>
</web:Web>
</xml>""", 'xml')

print soup.prettify()
<?xml version="1.0" encoding="utf-8"?>
<xml>
 <Web>
  <Total>
   4000
  </Total>
  <Offset>
   0
  </Offset>
 </Web>
</xml>

BeautifulSoup本身不是一个DOM库(它没有实现domapi)。为了使事情更复杂,您在xml片段中使用了名称空间。要解析特定的XML片段,可以使用BeautifulSoup,如下所示:

from BeautifulSoup import BeautifulSoup

xml = """<xml>
  <web:Web>
    <web:Total>4000</web:Total>
    <web:Offset>0</web:Offset>
  </web:Web>
</xml>"""

doc = BeautifulSoup( xml )
print doc.find( 'web:total' ).string
print doc.find( 'web:offset' ).string

如果不使用名称空间,代码可能如下所示:

from BeautifulSoup import BeautifulSoup

xml = """<xml>
  <Web>
    <Total>4000</Total>
    <Offset>0</Offset>
  </Web>
</xml>"""

doc = BeautifulSoup( xml )
print doc.xml.web.total.string
print doc.xml.web.offset.string

这里的关键是BeautifulSoup对名称空间一无所知。因此web:Web被视为web:web标记,而不是属于web名称空间的Web标记。虽然BeautifulSoup将web:web添加到xml元素字典中,但python语法无法将web:web识别为单个标识符。

您可以通过阅读documentation来了解更多信息。

相关问题 更多 >