如何解决重定向中的编码问题

how to work around encoding problems in redirects

我尝试抓取的网站似乎存在编码问题。页面声明它们是用 utf-8 编码的,但是如果我尝试抓取它们并使用请求获取 html 源,则重定向地址包含一个编码,而不是 utf-8。 浏览器似乎是宽容的,所以他们自动修复了这个问题,但是python请求包运行异常。

我的代码如下所示:

res= rq.get(url, allow_redirects=True)

尝试解码以下代码(隐藏在请求包中的某处)中的重定向字符串时遇到异常:

string.decode(encoding)

其中字符串是重定向字符串,编码是 'utf8':

string= b'/aktien/herm\xe8s-aktie'

我发现,编码实际上是以 'Windows-1252' 之类的方式编码的。实际上重定向应该继续'/aktien/herm%C3%A8s-aktie'。

现在我的问题是:我怎样才能获得对此类编码错误(如浏览器)更加宽容的请求,或者我怎样才能替代地传递编码?

我搜索了编码设置,但到目前为止我看到的是,请求总是根据结果自动执行。

顺便说一句。重定向的结果页面以(实际上是 utf-8)

开头
<!DOCTYPE html><html lang="de" prefix="og: http://ogp.me/ns#"><head><meta charset="utf-8">

您可以在 requests.get() 方法中使用 hooks= 参数并显式对 Location HTTP header 进行 urlencode。例如:

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