您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何使用Python urlopen提取非ASCII网址?

如何使用Python urlopen提取非ASCII网址?

严格来说URI不能包含非ASCII字符;您所拥有的是一个IRI

要将IRI转换为纯ASCII URI,请执行以下操作:

地址的主机名部分中的非ASCII字符必须使用基于Punycode的IDNA算法进行编码;

根据Ignacio的回答,路径中的非ASCII字符以及地址的大多数其他部分必须使用UTF-8和%-encoding进行编码。

所以:

import re, urlparse

def urlEncodeNonAscii(b):
    return re.sub('[\x80-\xFF]', lambda c: '%%%02x' % ord(c.group(0)), b)

def iriToUri(iri):
    parts= urlparse.urlparse(iri)
    return urlparse.urlunparse(
        part.encode('idna') if parti==1 else urlEncodeNonAscii(part.encode('utf-8'))
        for parti, part in enumerate(parts)
    )

>>> iriToUri(u'http://www.a\u0131b.com/a\u0131b')
'http://www.xn--ab-hpa.com/a%c4%b1b'

(从技术上讲,这在一般情况下还是不够好,因为urlparse它不会在主机名上拆分任何user:pass@前缀或:port后缀。仅主机名部分应经过IDNA编码。使用常规代码urllib.quote.encode('idna')在您使用时更容易编码构造一个URL,而不必将IRI分开。)

python 2022/1/1 18:34:14 有210人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶