2012-08-13 90 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'])