解析格式不佳的HTML / XML-ish内容

时间:2014-12-18 00:03:27

标签: python xml xml-parsing beautifulsoup html-parsing

我需要解析来自远程服务器的内容,我完全无法控制它返回与此类似的内容:

<alpha>
<bravo>123
<charlie>Some
Multiline
Text
</alpha>

<alpha>
<bravo>456
<charlie>More text
</alpha>

BeautifulSoup做一个有趣的工作,通过解释它来解析标记:

<html>
    <body>
        <alpha>
        <bravo>123
        <charlie>Some
        Multiline
        Text</charlie></bravo>
        </alpha>

        <alpha>
        <bravo>456
        <charlie>More text</charlie></bravo>
        </alpha>
    </body>
</html>

虽然我想要类似的东西:

<html>
    <body>
        <alpha>
        <bravo>123</bravo>
        <charlie>Some
        Multiline
        Text</charlie>
        </alpha>

        <alpha>
        <bravo>456</bravo>
        <charlie>More text</charlie>
        </alpha>
    </body>
</html>

因此我将其解析为alpha的某种数组,其结构与此类似:

[
    { bravo: ... , charlie: ... }
    { bravo: ... , charlie: ... }
]

我不能只读到每个节点的内容,直到下一个换行符,因为内容有时会跨越多行。

有没有人知道我可以解析这个问题?或推荐使用其他图书馆?

1 个答案:

答案 0 :(得分:2)

您需要在xml features turned on中对其进行解析,以便在引擎盖下使用lxml XML解析器。

BeautifulSoup(data, "xml")

注意,这需要安装lxml模块。

演示:

>>> from bs4 import BeautifulSoup
>>> 
>>> data = """
... <alpha>
... <bravo>123
... <charlie>Some
... Multiline
... Text
... </alpha>
... 
... <alpha>
... <bravo>456
... <charlie>More text
... </alpha>
... """
>>> soup = BeautifulSoup(data, "xml")
>>> print soup.prettify()
<?xml version="1.0" encoding="utf-8"?>
<alpha>
 <bravo>
  123
  <charlie>
   Some
Multiline
Text
  </charlie>
  <alpha>
   <bravo>
    456
    <charlie>
     More text
    </charlie>
   </bravo>
  </alpha>
 </bravo>
</alpha>

作为旁注,运行diagnose()并查看不同的解析器如何解析您拥有的输入数据。


以下是如何获得所需的词典列表:

print [{'bravo': alpha.bravo.get_text(strip=True),
        'charlie': alpha.charlie.get_text(strip=True)}
       for alpha in soup('alpha')]

打印:

[
    {'bravo': u'123Some\nMultiline\nText456More text', 'charlie': u'Some\nMultiline\nText'}, 
    {'bravo': u'456More text', 'charlie': u'More text'}
]