簡體   English   中英

正在加載帶有西里爾符號的 url

[英]Loading url with cyrillic symbols

我必須加載一些帶有西里爾符號的 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?


當我直接在代碼中使用 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

我有一個包含西里爾字母的網址列表。

是的,如果它包含原始(未進行%編碼)西里爾字母,則與示例不同,實際上它根本不是URL。

其中包含非ASCII字符的地址稱為IRI IRI不應在HTML鏈接中使用,但瀏覽器傾向於解決這些錯誤。

要將IRI轉換為URI,然后可以使用urllib打開URI,您必須:

  1. 使用Punycode(IDNA)在主機名部分中編碼非ASCII字符。

  2. 將IRI其余部分中的非ASCII字符編碼為UTF-8字節,然后對其進行URL編碼(導致示例示例URL中的%D0%BF... )。

一個示例實現

您可以嘗試使用urllib.unquote方法。

>>> import urllib
>>> string = urllib.unquote("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/")
>>> print string.decode("utf-8")
http://wincode.org/программирование/

以下代碼對我有用(從上面的 Arseny 修改代碼):

import urllib.parse
string='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/'
string = urllib.parse.unquote(string,encoding='utf-8') # http://wincode.org/программирование/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM