文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
Beautiful Soup 编码
任何 HTML
和 XML
文档都有自己的编码。通过 BeautifulSoup
解析之后,文档都被转换成 Unicode
字符串。
1. 编码自动检测
BeautifulSoup
使用了"编码自动检测"子库来识别当前文档编码并且转换成 Unicode
编码。 BeautifulSoup
对象的 .original_encoding
属性记录了自动识别编码的结果(经过测试, .original_encoding
不是很准确)。
"编码自动检测"大部分都能猜对编码格式,但是有时候会猜错。即使猜测正确,也是效率很慢。如果预先知道文档编码,可以设置编码参数来减少自动检测编码出错的概率并且提高文档解析速度。通过给 BeautifulSoup
构造函数提供 from_encoding
关键字参数达到目的: soup=BeautifulSoup(html_doc,from_encoding='utf-8')
a. 独立使用编码自动检测
编码自动检测可以独立于 BeautifulSoup
使用。检测未知编码时可以用这种办法:
from bs4 import UnicodeDammit
dammit=UnicodeDammit(htmldoc)
print(dammit.unicode_markup) #编码后的字符串
dammit.original_encoding #编码
- 如果事先猜测一些可能的编码,那么可以将这些编码列表作为
UnicodeDammit
的构造参数。此时UnicodeDammit
会优先检测这些编码。 - 如果 Python 中安装了
chardet
或者cchardet
,那么编码检测功能的准确率会大大提高
b. 混合编码
如果文档的一部分使用某个编码,另一部分采用另一种编码,那么可以用 UnicodeDammit.detwingle()
方法将这类文档转换成纯 UTF-8
编码格式(使用时需先解码)。
from bs4 import UnicodeDammit
new_doc=UnicodeDammit.detwingle(doc)
print(new_doc.decode('utf8')
2. Beautifulsoup.contains_replacement_characters
Beautifulsoup.contains_replacement_characters
属性为True
:表示BeautifulSoup
将特殊字符替换成了Unicode
特殊字符(U+FFFD
),极有可能是由于UTF-8
编码的文档包含了其他编码格式的字符Beautifulsoup.contains_replacement_characters
属性设为False
:表示结果中的Unicode
特殊字符(U+FFFD
)就是文档中原来的字符,而不是转码失败
3. 输出编码
BeautifulSoup
的输出编码始终为 UTF-8
而不管输入编码方式是什么。如 soup.prettify()
如果想指定编码方式,可以有以下几种方法:
- 将编码方式传入
.prettify()
方法,如:soup.prettify('ascii')
- 将编码方式传入
.encode()
方法,如:soup.encode('ascii')
如果文档中包含当前编码不支持的字符,那么将这些字符转换成一系列 XML 特殊字符引用
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论