BeautifulSoup find_all UnicodeEncodeError

时间:2015-12-15 17:32:44

标签: python encoding beautifulsoup

我从这个tutorial获得了以下代码:

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方法应用于 = f.select :year, options_for_select(["one", "two", "three", "four"], selected: f.object.year), {class: 'form-control'} 对象,则会收到属性错误,指出“ResultSet对象没有属性编码”。

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

2 个答案:

答案 0 :(得分:2)

回答我自己的问题。

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

python script.py > text.txt

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

chcp 65001 

然后执行脚本。

答案 1 :(得分:0)

因为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