我需要解析来自远程服务器的内容,我完全无法控制它返回与此类似的内容:
<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: ... }
]
我不能只读到每个节点的内容,直到下一个换行符,因为内容有时会跨越多行。
有没有人知道我可以解析这个问题?或推荐使用其他图书馆?
答案 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'}
]