Загрузка URL с символами кириллицы - PullRequest
1 голос
/ 14 мая 2010

Я должен загрузить какой-то 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

Ответы [ 2 ]

4 голосов
/ 14 мая 2010

У меня есть список URL, которые содержат кириллицу.

ОК, если он содержит необработанные (не% -кодированные) кириллические символы, что не похоже на пример, и фактически это вообще не URL.

Адрес с не-ASCII символами в нем известен как IRI . IRI не должны использоваться в HTML-ссылке, но браузеры, как правило, исправляют эти ошибки.

Чтобы преобразовать IRI в URI, который затем можно открыть с помощью urllib, вам необходимо:

  1. кодирует символы не ASCII в части имени хоста, используя Punycode (IDNA).

  2. кодирует не-ASCII-символы в оставшейся части байтов IRI в UTF-8 и URL-кодирует их (в результате получается %D0%BF..., как в примере URL).

пример реализации .

1 голос
/ 14 мая 2010

Вы можете попробовать использовать метод 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/программирование/
...