如何解决重定向中的编码问题
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
我尝试抓取的网站似乎存在编码问题。页面声明它们是用 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