【问题标题】:How can I request a URL that is already URL-encoded in python-requests?如何请求已经在 python-requests 中进行 URL 编码的 URL?
【发布时间】:2017-03-08 20:14:56
【问题描述】:

我正在尝试请求以下 URL:

https://www.sainsburys.co.uk/shop/gb/groceries/shiraz/barossa-valley-estate-grenache-shiraz-mourv%C3%A8dre-75cl

用 urllib 解码并打印出来:

In [36]: print urllib.unquote(url)
https://www.sainsburys.co.uk/shop/gb/groceries/shiraz/barossa-valley-estate-grenache-shiraz-mourvèdre-75cl

即重音“e”。

但似乎无论我用import requests; requests.get(...) 要求什么,我都会得到 404。

get 方法的正确输入是什么?

【问题讨论】:

    标签: python utf-8 python-requests urllib urlencode


    【解决方案1】:

    在将 url 传递给 urrlib unquote 后,您应该使用 'latin-1' 对其进行解码

    >>> 
    >>> k = "https://www.sainsburys.co.uk/shop/gb/groceries/shiraz/barossa-valley-estate-grenache-shiraz-mourv%C3%A8dre-75cl"
    >>> r = requests.get(urllib.unquote(k).decode("latin-1"))
    >>> r.status_code
    200
    >>> 
    

    【讨论】:

    • decode 是不必要且不正确的。它恰好在这种情况下起作用,因为 è 在 Latin-1 中,但对于高于 U+00FF 的任何代码点(例如 あ),它将失败。只需requests.get(urllib.unquote(k))。
    • 请阅读操作问题,他完全按照您的建议进行操作,结果发现 404 未找到。 decode 是使用 requests.get 打开链接所必需且正确的。
    • 嗯,在这种情况下你是对的...... OP 的网站似乎期望 URL 是 Latin-1 编码的,但其他网站并非如此。
    • 还注意到requests.get(urllib.unquote(u'.......')) 有效或requests.get(urllib.unquote(u.decode('utf8'))) 或requests.get(urllib.unquote(u.decode('latin-1'))),但requests.get(urllib.unquote(u).decode('utf8')) 无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多