返回介绍

Beautiful Soup 编码

发布于 2024-05-19 17:37:39 字数 2618 浏览 0 评论 0 收藏 0

任何 HTMLXML 文档都有自己的编码。通过 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文