【问题标题】:BeautifulSoup doesn't reads tags properlyBeautifulSoup 无法正确读取标签
【发布时间】:2012-08-10 03:18:30
【问题描述】:

我正在尝试使用 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) 也可以,但这也没有用。

【问题讨论】:

  • 我已确认您对 BeautifulSoup3 的问题。这个问题似乎在 BeautifulSoup4 中得到解决。安装 BeautifulSoup4。
  • BeautifulSoup4 为我工作。谢谢@StevenRumbalski

标签: python xml beautifulsoup


【解决方案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']

【讨论】:

  • 如果您仍然想要 BeautifulSoup 提供的功能,那么您可以指定它使用 xml 解析器来代替,即。 BeautifulSoup(markup, "xml") -- 不过需要lxml
【解决方案2】:

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

soup = BeautifulStoneSoup(markup, selfClosingTags=['element'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 2021-08-10
    • 2020-02-05
    • 2021-11-12
    • 1970-01-01
    • 2022-01-23
    • 2013-06-30
    相关资源
    最近更新 更多