2010-06-17 85 views
8

我有一个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?不起作用?

回答

8

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了解关于它的更多信息。

+0

谢谢!现在完美运作。 我总是感到困惑,以什么给find()..和这些命名空间的定义和他们写的方式迷惑了我很多...任何链接清除所有这些将不胜感激! – demos 2010-06-17 05:19:59

+0

只是我已经给你的文档链接...和大量的实验。 – 2010-06-17 05:26:57

+0

'AttributeError:'NoneType'对象没有属性'string'' – 2014-01-25 22:35:21

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> 
+0

对于4.4.1-1版本(在ubuntu 64 16.04中)并不完全正确。由于评论有限。请参阅[链接](https://pastebin.com/Q99iK6tM) – 2018-03-10 09:56:16

0

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

xml = BeautifulSoup(xml_content, 'xml')

相关问题