2011-10-16 50 views
5

Khi tôi muốn phân tích cú pháp tài liệu XML bằng Python sử dụng thư viện BeautifulSoup, Tôi gặp phải một số vấn đề. Tài liệu XML mà tôi muốn phân tích cú pháp:Phân tích cú pháp XML không chuẩn (thẻ 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> 

Như bạn có thể thấy ở trên, thẻ hơi lạ. Theo tôi, rằng (tag) không phải là một dạng XML đứng, phải không? Làm thế nào tôi có thể phân tích mẫu khủng khiếp này?

Trả lời

7

Bạn có thể sử dụng BeautifulSoup để phân tích 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 

Dưới mui xe, BeautifulSoup sử dụng lxml cho phân tích cú pháp XML. Mặc dù nó không cần thiết ở đây, bạn có thể muốn sử dụng lxml trực tiếp, vì nó cung cấp cho bạn cách gọn gàng hơn để điều hướng thông qua XML sử dụng XPath:

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

Wow. Cảm ơn bạn vì sự hận thù của bạn – user513004

+1

UserWarning: Lớp BeautifulStoneSoup không được chấp nhận. Thay vì sử dụng nó, chuyển các feature = "xml" vào hàm tạo của BeautifulSoup. –

+0

Cập nhật câu trả lời của tôi để sử dụng BeautifulSoup4. – unutbu

7

Bạn không cần BeautifulStoneSoup hoặc lxml. Pin đi kèm của Python thực hiện công việc tốt, và dường như không có bất kỳ điều gì không tuân thủ về XML của bạn.

>>> 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

điều này làm việc cho tôi trên XML mà BeautifulSoup không thể xử lý! – jsh

Các vấn đề liên quan