我发现其中包含\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的方式是:
例如(摘自链接的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/