BeautifulSoup不能正确读取标签

时间:2012-08-13 20:44:29

标签: python xml beautifulsoup

我想使用BeautifulSOup解析xml,但会导致输出不正确。

file.xml:

<?xml version="1.0" ?> 
<opening name="value1" >
      <element name="value1.1"/>
      <element name="value1.2">
        <element name="1.2.1"/>
      </element>
      <element name="value1.3">
        <element name="value1.3.1"/>
      </element>
</opening>

使用以下代码:

>>> a=open('file.xml').read()
>>> import BeautifulSoup
>>> s= BeautifulSoup.BeautifulSoup(a)
>>> print s.prettify()

我得到以下输出:

<?xml version='1.0' encoding='utf-8'?>
<opening name="value1">
 <element name="value1.1">
 </element>
 <element name="value1.2">
 </element>
 <element name="1.2.1">
 </element>
 <element name="value1.3">
 </element>
 <element name="value1.3.1">
 </element>
</opening>

为什么将所有元素显示为打开标记的子元素? 如何正确解析此文件?

我试过用过     s = BeautifulSoup.BeautifulStoneSoup(a) 但也没有用。

2 个答案:

答案 0 :(得分:1)

BeautifulSoup主要是一个HTML解析器,可以最好地处理格式错误的HTML。有一些XML库,例如lxml我强烈推荐 - 试试。

一个例子:

import lxml.etree

xml = """<?xml version="1.0" ?> 
<opening name="value1" >
      <element name="value1.1"/>
      <element name="value1.2">
        <element name="1.2.1"/>
      </element>
      <element name="value1.3">
        <element name="value1.3.1"/>
      </element>
</opening>
"""

r = lxml.etree.fromstring(xml)
r.xpath('//element/@name')
# ['value1.1', 'value1.2', '1.2.1', 'value1.3', 'value1.3.1']

答案 1 :(得分:0)

美丽的汤3需要一个特殊的参数才能让标签正确关闭。您需要BeautifulStoneSoup构造函数的selfClosingTags参数。使用类似的东西:

soup = BeautifulStoneSoup(markup, selfClosingTags=['element'])
相关问题