加载带有西里尔符号的 url

Max*_*rai 1 python url urllib

我必须加载一些带有西里尔符号的 url。我的脚本应该适用于这个:

http://wincode.org/%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0 %BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/

如果我将在浏览器中使用它,它将被替换为普通符号,但 urllib 代码失败并出现 404 错误。如何正确解码这个网址?


当我直接在代码中使用那个 url 时,比如 address = 'that address',它工作得很好。但是我使用解析页面来获取这个 url。我有一个包含西里尔字母的 url 列表。也许他们的编码不正确?这是更多代码:

requestData = urllib2.Request( %SOME_ADDRESS%, None,  {"User-Agent": user_agent})
requestHandler = pageHandler.open(requestData)

pageData = requestHandler.read().decode('utf-8')
soupHandler = BeautifulSoup(pageData)

topicLinks = []
for postBlock in soupHandler.findAll('a', href=re.compile('%SOME_REGEXP%')):
    topicLinks.append(postBlock['href'])

postAddress = choice(topicLinks)

postRequestData = urllib2.Request(postAddress, None,  {"User-Agent": user_agent})
postHandler = pageHandler.open(postRequestData)
postData = postHandler.read()

  File "/usr/lib/python2.6/urllib2.py", line 518, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 404: Not Found
Run Code Online (Sandbox Code Playgroud)

bob*_*nce 5

我有一个包含西里尔字母的 url 列表。

好的,如果它包含与示例不同的原始(不是 % 编码的)西里尔字符,实际上它根本不是 URL。

包含非 ASCII 字符的地址称为IRI。不应在 HTML 链接中使用 IRI,但浏览器往往会修复这些错误。

要将 IRI 转换为 URI,然后您可以使用 将其打开urllib,您必须:

  1. 使用 Punycode (IDNA) 在主机名部分编码非 ASCII 字符。

  2. 将 IRI 其余部分中的非 ASCII 字符编码为 UTF-8 字节并对它们进行 URL 编码(结果%D0%BF...类似于示例 URL)。

一个示例实现