我有一个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的解决方案
答案 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。