2011-10-16 51 views
5

Cuando quiero analizar documentos XML en Python usando la biblioteca BeautifulSoup, tuve algunos problemas. El documento XML que quiero analizar:Analizando XML no estándar (etiqueta 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> 

Como puede ver arriba, la etiqueta es un poco extraña. En mi opinión, esa (etiqueta) no es una forma de soporte XML, ¿verdad? ¿Cómo puedo analizar esta terrible forma?

Respuesta

7

Usted podría utilizar BeautifulSoup a analizar 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 

Bajo el capó, BeautifulSoup utiliza lxml para analizar XML. Aunque no se necesita aquí, puede que quiera usar lxml directamente, ya que le da una manera más sucintas para navegar a través de XML usando 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. Gracias por su cordialidad – user513004

+1

UserWarning: La clase BeautifulStoneSoup está en desuso. En lugar de usarlo, pase features = "xml" en el constructor BeautifulSoup. –

+0

Actualicé mi respuesta para usar BeautifulSoup4. – unutbu

7

No es necesario BeautifulStoneSoup o lxml. Las baterías incluidas de Python hacen bien el trabajo, y no parece haber nada que no cumpla con su 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

esto funcionó para mí en XML que BeautifulSoup no pudo manejar! – jsh