我试图抓取的一个网站似乎有编码问题。页面声明,它们是用utf-8编码的,但如果我试图抓取它们并使用请求获取html源,重定向地址包含一个编码,而不是utf-8。浏览器似乎是宽容的,所以他们会自动修复这个问题,但python请求包会遇到异常。
我的代码如下:
res= rq.get(url, allow_redirects=True)
当尝试解码以下代码中的重定向字符串(隐藏在请求包中的某个位置(时,会遇到异常:
string.decode(encoding)
其中string是重定向字符串,编码为"utf8":
string= b'/aktien/hermxe8s-aktie'
我发现,编码实际上是在类似"Windows-1252"的东西中编码的。实际上重定向应该在"/aktien/herm%C3%A8s aktie"上进行。
现在我的问题是:我如何才能得到对此类编码错误(如浏览器(更宽容的请求,或者我如何才能传递编码?
我搜索了编码设置,但到目前为止,请求总是根据结果自动执行。
Btw。重定向的结果页面以开头(它实际上声明为utf-8(
<!DOCTYPE html><html lang="de" prefix="og: http://ogp.me/ns#"><head><meta charset="utf-8">
您可以在requests.get()
方法中使用hooks=
参数,并显式地对Location
HTTP标头进行url编码。例如:
import requests
import urllib.parse
url = "<YOUR URL FROM EXAMPLE>"
def response_hook(hook_data, **kwargs):
if "Location" in hook_data.headers:
hook_data.headers["Location"] = urllib.parse.quote(
hook_data.headers["Location"]
)
res = requests.get(url, allow_redirects=True, hooks={"response": response_hook})
print(res.url)
打印:
https://.../herm%C3%A8s-aktie