2012-08-13 86 views
0

我打算使用BeautifulSOup解析XML,但它会导致不正确的输出。BeautifulSoup不能正确读取标签

file.xml:

<?xml version="1.0" ?> 
<opening name="value1" > 
     <element name="value1.1"/> 
     <element name="value1.2"> 
     <element name="1.2.1"/> 
     </element> 
     <element name="value1.3"> 
     <element name="value1.3.1"/> 
     </element> 
</opening> 

使用下面的代码:

>>> a=open('file.xml').read() 
>>> import BeautifulSoup 
>>> s= BeautifulSoup.BeautifulSoup(a) 
>>> print s.prettify() 

,我得到以下输出:

<?xml version='1.0' encoding='utf-8'?> 
<opening name="value1"> 
<element name="value1.1"> 
</element> 
<element name="value1.2"> 
</element> 
<element name="1.2.1"> 
</element> 
<element name="value1.3"> 
</element> 
<element name="value1.3.1"> 
</element> 
</opening> 

为什么是显示所有的元素作为开放的孩子标签 ? 如何正确解析此文件?

我试过使用 s = BeautifulSoup.BeautifulStoneSoup(a) 也,但这也没有奏效。

+1

我确认您的问题与BeautifulSoup3。这个问题似乎在BeautifulSoup4中得到解决。安装BeautifulSoup4。 – 2012-08-13 21:07:07

+0

BeautifulSoup4为我工作。谢谢@StevenRumbalski – 2013-01-05 14:16:17

回答

1

BeautifulSoup主要是一个HTML解析器,它试图最好地处理错误形成的HTML。那里有XML库,比如lxml,我强烈建议 - 尝试一下。

一个例子:

import lxml.etree 

xml = """<?xml version="1.0" ?> 
<opening name="value1" > 
     <element name="value1.1"/> 
     <element name="value1.2"> 
     <element name="1.2.1"/> 
     </element> 
     <element name="value1.3"> 
     <element name="value1.3.1"/> 
     </element> 
</opening> 
""" 

r = lxml.etree.fromstring(xml) 
r.xpath('//element/@name') 
# ['value1.1', 'value1.2', '1.2.1', 'value1.3', 'value1.3.1'] 
+2

如果你仍然需要BeautifulSoup提供的功能,那么你可以指定它使用XML解析器,而不是ie。 'BeautifulSoup(标记,“xml”) - 它需要'lxml'。 – Dunes 2012-08-13 21:05:22

0

美丽的汤3需要特殊的参数来获得标签正确关闭。您需要BeautifulStoneSoup构造函数的selfClosingTags参数。使用类似于:

soup = BeautifulStoneSoup(markup, selfClosingTags=['element'])