【问题标题】:Unicode Parsing Error with BeautifulSoupBeautifulSoup 的 Unicode 解析错误
【发布时间】:2023-03-16 23:04:01
【问题描述】:

以下代码:

from bs4 import BeautifulSoup as soup
from urllib.request import urlopen as uReq

uClient = uReq('http://www.google.com')
page_html = uClient.read()

uClient.close()

page_soup = soup(page_html.decode('utf-8', 'ignore'), 'lxml')
print(page_soup.find_all('p'))

...产生以下错误:

C:\>python ws1.py
Traceback (most recent call last):
  File "ws1.py", line 10, in <module>
    print(page_soup.find_all('p'))
  File "C:\Python34\lib\encodings\cp437.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\xa9' in position 40
: character maps to <undefined>

我已经徒劳地寻找解决方案,因为我读过的每篇文章都建议使用特定的编码,但没有一个能解决问题。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 问题是page_soup.find() 正在返回一个无法在您的控制台中打印的字符。
  • 您是否知道一种可以促进这一点的编码,或者我可以要求(双关语)忽略违规字符?
  • 我刚刚对我的答案进行了编辑,我最初包含了一个根本不需要的功能。新的答案也更加完整。
  • 您是否将 Windows 机器上的 PYTHONIOENCODING 环境变量设置为 utf-8?并在脚本的第一行声明 #coding: utf-8 ?如果您被允许,您还可以通过请求提取数据。在 py3 中,response.content 返回字节,因此您也可以在那里声明 (utf_response = response.content.decode('utf-8')。这些东西每次都能解决我的问题。.
  • @jlaur 这被称为黑暗中的一枪。 #coding: utf8 声明源编码,与使用的库无关。 PYTHONIOENCODING=utf8 通常在 Linux 上运行,并且可能在带有 chcp 65001 在控制台中或重定向到文件时在 Windows 上运行,否则会导致打印垃圾。

标签: python python-3.x unicode web-scraping beautifulsoup


【解决方案1】:

您正在尝试打印一个 Unicode 字符串,其中包含无法在您的控制台使用的编码中表示的字符。

您似乎正在使用 Windows 命令行,这意味着您的问题只需切换到 Python 3.6 即可解决 - 它完全绕过控制台编码并将 Unicode 直接发送到 Windows。

如果这不可能,您可以自己对字符串进行编码,并指定不可打印的字符应替换为转义序列。然后您必须再次对其进行解码,以便print 能够正常工作。

bstr = page_soup.find_all('p').encode(sys.stdout.encoding, errors='backslashreplace')
print(bstr.decode(sys.stdout.encoding))

【讨论】:

    猜你喜欢
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2015-09-08
    • 2020-12-26
    • 2018-02-01
    相关资源
    最近更新 更多