我发现其中包含\u Unicode字符的URL,如下所示(请注意,这不会映射到有效页面-只是一个示例)。
http://my_site_name.com/\u0442\uab86\u0454\uab8eR-\u0454\u043d-\u043c/23795908
如何使用Python解码/编码这样的URL,以便我可以成功地执行HTTP GET来从该网页检索数据?

最佳答案

从技术上讲,这些不是有效的URL,但它们是有效的IRI(Internationalized Resource Identifiers),如RFC 3987中所定义。

将IRI编码为URI的方式是:

  • UTF-8编码路径
  • %-编码生成的UTF-8

  • 例如(摘自链接的Wikipedia文章),此IRI:
    https://en.wiktionary.org/wiki/Ῥόδος
    

    …映射到以下URI:
    https://en.wiktionary.org/wiki/%E1%BF%AC%CF%8C%CE%B4%CE%BF%CF%82
    

    我相信 requests 可以立即解决这些问题(尽管直到最近才出现,并且只有“部分支持”才能支持3.0,我不确定这是什么意思)。我很确定Python2.7中的urllib2不会,而Python 3.6中的urllib.request可能也不会。

    无论如何,如果您选择的HTTP库不处理IRI,则可以手动进行:
    def iri_to_uri(iri):
        p = urllib.parse.urlparse(iri)
        path = urllib.parse.quote_from_bytes(p.path.encode('utf-8'))
        p = [:2] + (path,) + p[3:]
        return urllib.parse.urlunparse(p2)
    

    还有很多第三方库可以处理IRI,大部分是从Twisted和Amara等其他项目中分离出来的。可能值得在PyPI上搜索一个,而不是自己构建。

    或者,您可能希望使用像 hyperlink 这样的更高级别的库来处理RFC 3987中的所有复杂问题(以及URIt规范的当前版本RFC 3986-requests 2.x和Python 3.6 stdlib都无法正确处理)。

    如果您必须手动处理IRI,即使从技术上讲它们不是相关规范,也很有可能还必须处理IDN Internationalized Domain Names来代替ASCII域名。因此,您可能想要执行以下操作:
    def iri_to_uri(iri):
        p = urllib.parse.urlparse(iri)
        netloc = p.netloc.encode('idna').decode('ascii')
        path = urllib.parse.quote_from_bytes(p.path.encode('utf-8'))
        p = [:1] + (netloc, path) + p[3:]
        return urllib.parse.urlunparse(p2)
    

    关于python - 如何导航到带有\u的URL?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49620725/

    10-12 20:22