Python'ascii'编解码器无法使用request.get

时间:2016-11-17 16:38:00

标签: python json encoding utf-8 ascii

我有一个Python程序,它从站点抓取数据并返回一个json。已爬网站点的元标记为charset = ISO-8859-1。这是源代码:

url = 'https://www.example.com'
source_code = requests.get(url)
plain_text = source_code.text

之后,我通过Beautiful Soup获取信息,然后创建一个json。问题是,某些符号,即符号显示为\ u0080或\ x80(在python中),因此我无法在php中使用或解码它们。所以我尝试了plain_text.decode('ISO-8859-1)plain_text.decode('cp1252')所以我可以将它们编码为utf-8,但每次我得到错误:'ascii'编解码器不能编码位置8496中的字符u'\ xf6':序数不在范围内(128)。

修改

使用.content代替.text

后@ChrisKoston建议后的新代码
url = 'https://www.example.com'
source_code = requests.get(url)
plain_text = source_code.content
the_sourcecode = plain_text.decode('cp1252').encode('UTF-8')
soup = BeautifulSoup(the_sourcecode, 'html.parser')

现在可以进行编码和解码,但仍然存在字符问题。

EDIT2

解决方案是将其设置为.content.decode('cp1252')

url = 'https://www.example.com'
source_code = requests.get(url)
plain_text = source_code.content.decode('cp1252')
soup = BeautifulSoup(plain_text, 'html.parser')

特别感谢Tomalak的解决方案

1 个答案:

答案 0 :(得分:2)

您必须将decode()的结果存储在某处,因为它不会修改原始变量。

另一件事:

  • decode()将字节列表转换为字符串。
  • encode()执行oposite,它将字符串转换为字节列表

BeautifulSoup对字符串感到满意;你根本不需要使用encode()

import requests
from bs4 import BeautifulSoup

url = 'https://www.example.com'
response = requests.get(url)
html = response.content.decode('cp1252')
soup = BeautifulSoup(html, 'html.parser')

提示:要使用HTML,您可能需要查看pyquery而不是BeautifulSoup。