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

dem*_*mos 8 python xml beautifulsoup xml-namespaces xml-parsing

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

<xml>
<web:Web>
<web:Total>4000</web:Total>
<web:Offset>0</web:Offset>
</web:Web>
</xml>
Run Code Online (Sandbox Code Playgroud)

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

xmlDom.web ["Web"].总计?不起作用?

Cra*_*der 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

这里的关键是BeautifulSoup不知道(或关心)有关命名空间的任何信息.因此web:Web被视为web:web标签而不是Web属于web命名空间的标签.当BeautifulSoup添加web:web到xml元素字典时,python语法不能识别web:web为单个标识符.

您可以通过阅读文档了解有关它的更多信息.


Suz*_*ana 6

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

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>
Run Code Online (Sandbox Code Playgroud)