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

时间:2010-06-17 04:40:41

标签: python xml xml-parsing beautifulsoup xml-namespaces

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

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

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

xmlDom.web [“Web”]。总计?不起作用?

3 个答案:

答案 0 :(得分:10)

BeautifulSoup本身不是DOM库(它不实现DOM API)。更复杂的是,您在该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

了解更多相关信息

答案 1 :(得分:6)

这是一个老问题,但有人可能不知道,如果将'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>

答案 2 :(得分:0)

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

  

xml = BeautifulSoup(xml_content,'xml')