首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解析非标准XML (CDATA标记)

解析非标准XML (CDATA标记)
EN

Stack Overflow用户
提问于 2011-10-17 00:58:16
回答 2查看 16.3K关注 0票数 5

当我想用BeautifulSoup库解析Python中的XML文档时,我遇到了一些问题。我要解析的XML文档:

代码语言:javascript
运行
复制
<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表单,对吧?我如何解析这个糟糕的表单呢?

EN

回答 2

Stack Overflow用户

发布于 2011-10-17 19:38:34

您不需要BeautifulStoneSoup或lxml。Python附带的电池可以很好地完成这项工作,而且您的XML似乎没有任何不兼容的地方。

代码语言:javascript
运行
复制
>>> 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'
>>>
票数 8
EN

Stack Overflow用户

发布于 2011-10-17 02:07:36

您可以使用BeautifulSoup来解析XML:

代码语言:javascript
运行
复制
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中导航的更简洁的方法:

代码语言:javascript
运行
复制
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
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7785831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档