【问题标题】:BeautifulSoup find_all UnicodeEncodeError [duplicate]BeautifulSoup find_all UnicodeEncodeError [重复]
【发布时间】:2015-12-15 17:32:44
【问题描述】:

我有以下从tutorial 得到的代码:

from bs4 import BeautifulSoup
import requests
req=requests.get("http://www.aflcio.org/Legislation-and-Politics/Legislative-Alerts")
data=req.text
soup=BeautifulSoup(data)
letters=soup.find_all("div",class_="ec_statements")
print(letters)

我收到以下错误:

Traceback (most recent call last):
  File ".\scr3.py", line 7, in <module>
    print(letters)
  File "C:\Users\adi\AppData\Local\Programs\Python\Python35\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 '\u2019' in position 7787: character maps to <undefined>

如果我尝试将encode('utf-8') 方法应用于letters 对象,我会收到一个属性错误,提示“ResultSet 对象没有属性编码”。

有人知道打印字母对象的解决方法吗?我在 Windows 7 上使用 Python 3.5 和 BeautifulSoup 4。

【问题讨论】:

    标签: python encoding beautifulsoup


    【解决方案1】:

    回答我自己的问题。

    我使用 Windows 命令行来执行 Python 脚本。事实证明,命令行无法处理打印输出。我意识到当我将输出发送到文本文件时:

    python script.py > text.txt
    

    这并没有引发错误。或者,如果我仍然想在命令行中显示输出,我可以先为其设置 utf-8:

    chcp 65001 
    

    然后执行脚本。

    【讨论】:

    • 好的,很高兴您找到了解决方案。
    【解决方案2】:

    因为find_all() 返回一组结果。使用 for 循环遍历每个返回的元素:

    from bs4 import BeautifulSoup
    import requests
    req=requests.get("http://www.aflcio.org/Legislation-and-Politics/Legislative-Alerts")
    data=req.text
    soup=BeautifulSoup(data)
    letters=soup.find_all("div",class_="ec_statements")
    for letter in letters:
       print(letter.encode('utf-8'))
       print(letter.text)
    

    您还可以使用.text 函数,它会为您提供找到的元素的文本并自动处理编码。

    当使用.find() 时,您会得到一个元素作为结果并可以将其打印出来,.findAll()(或通常用 Python 编写为.find_all())返回一组元素,它没有函数 .encode(),因为它是一个 Unicode 对象。

    另一种可能的解决方案是在脚本开头写# -*- coding: utf-8 -*-

    print(letters) 在脚本开头写了# -*- coding: utf-8 -*- 后为我工作,没有它也为我工作,但我使用的是 Python 2.7

    【讨论】:

    • 相同的 UnicodeEncodeError。当我使用 prettify 时,我也会遇到这样的错误。使用 # -- coding: utf-8 -- 没有解决任何问题。 setdefaultencoding 方法在 Python 3 中也不存在,因为默认值已经是 utf-8,因为这个答案建议:stackoverflow.com/questions/28127513/…。我发现问题出在 Windows 命令行上,所以我在上面提供了答案。
    • 如果不重新加载(sys)将无法工作!
    • 我已经从您的答案中删除了setdefaultencoding(),因为它是一个令人讨厌的黑客行为,它掩盖了其他问题。它应该只由知道它做什么的人使用
    • # -*- coding: utf-8 -*- 仅影响写入源代码的非 ASCII 字符的解释方式。它对从外部源读取的字符串没有影响。
    • 您应该避免在打印语句中进行编码以避免双重编码。打印到控制台的问题应该由环境修复
    猜你喜欢
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2019-12-20
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多