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为单个标识符.
您可以通过阅读文档了解有关它的更多信息.
这是一个老问题,但有人可能不知道,如果你将第二个参数传递给构造函数,至少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)