0

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

文件.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) 但这也没有用。

4

2 回答 2

1

BeautifulSoup主要是一个HTML解析器,它尽力处理格式错误的 HTML。那里有lxml我强烈推荐的 XML 库 - 试试看。

一个例子:

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']
于 2012-08-13T20:53:55.110 回答
0

Beautiful Soup 3 需要一个特殊的参数来让标签正确关闭。您需要 BeautifulStoneSoup 构造函数的 selfClosingTags 参数。使用类似的东西:

soup = BeautifulStoneSoup(markup, selfClosingTags=['element'])
于 2012-08-23T06:10:17.697 回答