Разбор нестандартного XML (тэг CDATA) - PullRequest
5 голосов
/ 16 октября 2011

Когда я хочу проанализировать XML-документ в Python с использованием библиотеки BeautifulSoup, я столкнулся с некоторыми проблемами.XML-документ, который я хочу проанализировать:

<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, верно?Как я могу разобрать эту ужасную форму?

Ответы [ 2 ]

8 голосов
/ 17 октября 2011

Вам не нужен 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'
>>>
7 голосов
/ 16 октября 2011

Вы можете использовать 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 напрямую, поскольку он дает вам более краткие способы навигации по XML с использованием 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...