【问题标题】:Unicode errors when printing python beautiful soup object打印 python 美丽的汤对象时出现 Unicode 错误
【发布时间】:2020-04-28 11:08:47
【问题描述】:
import bs4 as bs
import urllib.request

sauce = urllib.request.urlopen('https://stats.swehockey.se/Teams/Info/TeamRoster/10333').read()
soup = bs.BeautifulSoup(sauce, 'lxml')

print(soup)

此代码产生以下错误

UnicodeEncodeError: 'ascii' codec can't encode character '\xbb' in position 1509: ordinal not in range(128)

我尝试了几种解决方法,但它们都有一些缺点。在stackoverflow上搜索后,我找到了更改.stdout的解决方案,如下所示:

import bs4 as bs
import urllib.request
import sys
import codecs
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
sys.stderr = codecs.getwriter('utf-8')(sys.stderr)

sauce = urllib.request.urlopen('https://stats.swehockey.se/Teams/Info/TeamRoster/10333').read()
soup = bs.BeautifulSoup(sauce, 'lxml')

print(soup)

我不再收到错误,但是输出不再指向终端。我不确定为什么会这样。使用.prettify('utf-8') 方法也可以消除错误并产生输出,但是,结果对象是一个字符串,而不是一个漂亮的汤对象,因此没有任何关联的 bs 方法(例如 .find_all())。 .encode('utf-8') 方法也会出现类似的问题。

另外,我注意到在输出中,漂亮的汤对象中仍然有许多 \r 和 \n 字符,而不是纯 html 内容。

我想要一个漂亮的汤对象,没有任何可以打印到终端的 \r 或 \n 字符。

【问题讨论】:

    标签: python unicode beautifulsoup


    【解决方案1】:

    在您的代码中:

    sauce = urllib.request.urlopen('https://stats.swehockey.se/Teams/Info/TeamRoster/10333').read()
    soup = bs.BeautifulSoup(sauce, 'lxml')
    

    sauce 的类型为 bytes。当您将其传递给bs.BeautifulSoup() 时,BeautifulSoup 会尝试将这些字节解码为ascii 字符串,但失败了,因为它实际上是一个utf-8 字符串——根据Content-Type 响应标头(text/html; charset=utf-8)以及 html 文档开头的 meta 标记 (<meta charset="utf-8" />)。

    bs.BeautifulSoup() 的第一个参数markup 采用表示要解析的标记的字符串或类似文件的对象。您应该将这些字节显式解码为 utf-8 编码字符串,并使用它而不是原始字节,如下所示:

    sauce = urllib.request.urlopen('https://stats.swehockey.se/Teams/Info/TeamRoster/10333').read().decode('utf-8')
    soup = bs.BeautifulSoup(sauce, 'lxml')
    

    另外,我注意到在输出中,漂亮的汤对象中仍然有许多 \r 和 \n 字符,而不是纯 html 内容。

    我想要一个漂亮的汤对象,没有任何可以打印到终端的 \r 或 \n 字符。

    \r\n 字符只是换行符的表示。如果您要打印这些,或在文本编辑器中查看它们,它们将显示为实际的换行符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      相关资源
      最近更新 更多