【发布时间】:2015-09-16 13:47:26
【问题描述】:
已编辑。 我正在使用 BeautifulSoup 和 lxml 来解析来自外部源的 XML 文档。奇怪的是,在某些文档上,解析器似乎在文本中间放弃并缩短了文档。
我已将其缩减为一个精确的测试用例:
from bs4 import BeautifulSoup
xml = "<ElementA><ElementB>Before bad character XX\n\x80 BAD\nAfter bad character</ElementB><ElementC>In element C</ElementC></ElementA>"
soup = BeautifulSoup(xml,"xml")
soup
给出不正确的输出:
<?xml version="1.0" encoding="utf-8"?>
<ElementA><ElementB/></ElementA>
但如果我只更改一件事并删除单个字符“X”:
from bs4 import BeautifulSoup
xml = "<ElementA><ElementB>Before bad character X\n\x80 BAD\nAfter bad character</ElementB><ElementC>In element C</ElementC></ElementA>"
soup = BeautifulSoup(xml,"xml")
soup
然后我得到更完整的输出:
<?xml version="1.0" encoding="utf-8"?>
<ElementA><ElementB>Before bad character X
BAD
After bad character</ElementB><ElementC>In element C</ElementC></ElementA>
发生了什么事?我在 Python 3.4.3、OSX 上使用 BeautifulSoup 4.3.2 和 LXML 3.4.4。
到目前为止,我已经通过在解析之前通过 UnicodeDammit.detwingle() 传递 XML 字符串来解决这个问题,但是如果我能理解发生了什么以及单个附加字符如何具有这样的对文件的破坏性影响。
编辑。 使用 detwingle 或 ftfy 之类的工具不再有效。这是一个替代测试用例,具有正确的编码,在我的机器上没有被 bs4 / lxml 正确解析:
xml = "<ElementA><ElementB>Before bad character XX\n• BAD\nAfter bad character</ElementB><ElementC>In element C</ElementC></ElementA>"
出现与上述相同的问题。 谁能解释一下?
【问题讨论】:
标签: python beautifulsoup lxml python-unicode