2011-10-16 155 views
5

當我想用Python中的BeautifulSoup庫解析XML文檔時,我遇到了一些問題。我想解析的XML文檔:解析非標準XML(CDATA標記)

<item> 
<title><![CDATA[Title Sample]]></title> 
<link /><![CDATA[http://banhada.kr/?cateCode=09&viewCode=S0941580]]> 
<time_start>2011-10-10 09:00:00</time_start> 
<time_end>2011-10-17 09:00:00</time_end> 
<price_original>35000</price_original> 
<price_now>20000</price_now> 
</item> 

正如您在上面看到的,標記有點奇怪。在我看來,(標籤)不是一種立場XML形式,對吧?我怎樣才能解析這種可怕的形式?

回答

7

你可以使用BeautifulSoup解析XML:

import bs4 as bs 
content='''\ 
<item> 
<title><![CDATA[Title Sample]]></title> 
<link /><![CDATA[http://banhada.kr/?cateCode=09&viewCode=S0941580]]> 
<time_start>2011-10-10 09:00:00</time_start> 
<time_end>2011-10-17 09:00:00</time_end> 
<price_original>35000</price_original> 
<price_now>20000</price_now> 
</item>'''  

soup = bs.BeautifulSoup(content, 'xml') 

title = soup.title 
print(title.string) 
# Title Sample 

link = soup.link.nextSibling 
print(link) 
# http://banhada.kr/?cateCode=09&viewCode=S0941580 

引擎蓋下,BeautifulSoup使用lxml解析XML。 雖然它沒有必要在這裏,你可能想直接使用lxml的,因爲它爲您提供了更簡潔的方式使用XPath通過XML瀏覽:

import lxml.etree as ET 

content='''\ 
<item> 
<title><![CDATA[Title Sample]]></title> 
<link /><![CDATA[http://banhada.kr/?cateCode=09&viewCode=S0941580]]> 
<time_start>2011-10-10 09:00:00</time_start> 
<time_end>2011-10-17 09:00:00</time_end> 
<price_original>35000</price_original> 
<price_now>20000</price_now> 
</item>'''  

doc = ET.fromstring(content) 

title = doc.find('title') 
print(title.text) 
# Title Sample 

link = doc.find('link') 
print(link.tail) 
# http://banhada.kr/?cateCode=09&viewCode=S0941580 
+0

哇。感謝您的kandness – user513004

+1

UserWarning:BeautifulStoneSoup類已被棄用。而不是使用它,將特徵=「xml」傳遞到BeautifulSoup構造函數中。 –

+0

更新了我的答案,以使用BeautifulSoup4。 – unutbu

7

你不需要BeautifulStoneSoup或LXML。 Python包含的電池很好地完成了這項工作,並且似乎沒有任何關於XML的不合規格。

>>> content='''\ 
... <item> 
... <title><![CDATA[Title Sample]]></title> 
... <link /><![CDATA[http://banhada.kr/?cateCode=09&viewCode=S0941580]]> 
... <time_start>2011-10-10 09:00:00</time_start> 
... <time_end>2011-10-17 09:00:00</time_end> 
... <price_original>35000</price_original> 
... <price_now>20000</price_now> 
... </item>''' 
>>> import xml.etree.cElementTree as et 
>>> foo = et.XML(content) 
>>> for e in foo: 
...  print e.tag, e.text, repr(e.tail) 
... 
title Title Sample '\n' 
link None 'http://banhada.kr/?cateCode=09&viewCode=S0941580\n' 
time_start 2011-10-10 09:00:00 '\n' 
time_end 2011-10-17 09:00:00 '\n' 
price_original 35000 '\n' 
price_now 20000 '\n' 
>>> 
+0

這對我來說在BeautifulSoup無法處理的XML上很有效! – jsh