我有一个XML文档,其内容如下:
<xml>
<web:Web>
<web:Total>4000</web:Total>
<web:Offset>0</web:Offset>
</web:Web>
</xml>
我的问题是如何在python中使用像BeautifulSoup这样的库来访问它们?
xmlDom.web [“Web”]。总计?不起作用?
答案 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')