2011-10-16 26 views
5

BeautifulSoupライブラリを使用してPythonで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

あなたはXMLを解析するためにBeautifulSoupを使用することができます。

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は、XMLを解析するためlxmlを使用しています。

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クラスは非推奨です。それを使用する代わりに、features = "xml"をBeautifulSoupコンストラクタに渡します。 –

+0

BeautifulSoup4を使用するための私の答えを更新しました。 – unutbu

7

あなたはBeautifulStoneSoupまたはlxmlのを必要としません: それはここでは必要ありませんが、あなたはそれがあなたのXPathを使用してXMLをナビゲートするために、より簡潔な方法を提供するので、直接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