2011-10-16 49 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