如何使用BeautifulSoup访问名称空间的XML元素?
我有一个XML文档,其内容是这样的:如何使用BeautifulSoup访问名称空间的XML元素?
<xml>
<web:Web>
<web:Total>4000</web:Total>
<web:Offset>0</web:Offset>
</web:Web>
</xml>
我的问题是他们在使用Python库一样BeautifulSoup我怎么上网?
xmlDom.web [“Web”]。Total?不起作用?
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了解关于它的更多信息。
这是一个老问题,但有些人可能不知道,至少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>
对于4.4.1-1版本(在ubuntu 64 16.04中)并不完全正确。由于评论有限。请参阅[链接](https://pastebin.com/Q99iK6tM) – 2018-03-10 09:56:16
你应该明确地定义你的根命名空间元素,使用xmlns:prefix="URI"
语法(see examples here),然后通过BeautifulSoup的prefix:tag
访问属性。请记住,你也应该明确地定义,如何BeautifulSoup应该处理你的文件,在这种情况下:
xml = BeautifulSoup(xml_content, 'xml')
谢谢!现在完美运作。 我总是感到困惑,以什么给find()..和这些命名空间的定义和他们写的方式迷惑了我很多...任何链接清除所有这些将不胜感激! – demos 2010-06-17 05:19:59
只是我已经给你的文档链接...和大量的实验。 – 2010-06-17 05:26:57
'AttributeError:'NoneType'对象没有属性'string'' – 2014-01-25 22:35:21