【问题标题】:Encoding issue of a character in utf-8utf-8中字符的编码问题
【发布时间】:2014-09-07 12:58:44
【问题描述】:

我通过a.get('href') 使用漂亮的汤库从网页获取链接。在链接中有一个奇怪的字符®,但当我得到它时,它变成了®。如何正确编码?我已经在页首添加了# -*- coding: utf-8 -*-

r = requests.get(url)

soup = BeautifulSoup(r.text)

【问题讨论】:

  • 没有足够的信息来回答您的问题。如何判断它“变成”“®”?也许只是我们的输出有问题?
  • 当我打印字符串时,我在终端输入了那个字符
  • 您是如何将页面加载到 BeautifulSoup 中的?它在某处被解码为 Latin1 而不是 UTF-8。 PEP263 注释适用于您的源代码,不适用于您加载的任何其他数据。
  • 我使用 requests 对象。我正在更新代码

标签: python utf-8 beautifulsoup python-requests mojibake


【解决方案1】:

不要不要使用r.text;将解码留给BeautifulSoup

soup = BeautifulSoup(r.content)

r.content 以字节为单位为您提供响应,无需解码。另一方面,r.text 是解码为 unicode 的响应。

发生的情况是服务器没有在响应标头中包含字符集。在那一刻,requests 遵循HTTP RFC 2261, section 3.7.1text/ 响应默认情况下预计使用 ISO-8859-1(拉丁语 1)字符集。

对于您的 HTML 页面,该默认设置是错误的,并且您得到了不正确的结果; r.text 将字节解码为 Latin-1,得到 Mojibake:

>>> print u'®'.encode('utf8').decode('latin1')
®

HTML 本身可以在 HTML 页面本身中包含正确的编码,在 HTML 标头中以 <meta> tag 的形式。 BeautifulSoup 将使用该标头并为您解码字节。

即使<meta> 标头标签缺失,BeautifulSoup 也包含auto-detect encodings 的其他方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    相关资源
    最近更新 更多