urllib.py не работает с https?

В моем приложении Python я пытаюсь открыть URL-адрес https, но получаю:

 File "C:\Python26\lib\urllib.py", line 215, in open_unknown
    raise IOError, ('url error', 'unknown url type', type)
IOError: [Errno url error] unknown url type: 'https'

мой код:

import urllib
def generate_embedded_doc(doc_id):
    url = "https://docs.google.com/document/ub?id=" + doc_id + "&embedded=true"
    src = urllib.urlopen(url).read()
    ...
    return src

person Vladimir Keleshev    schedule 19.09.2010    source источник
comment
Использование SSL в этом случае бесполезно, вы подключаетесь из одного сервиса Google в другой, я не думаю, что есть риск MITM-атак :-)   -  person leoluk    schedule 19.09.2010


Ответы (3)


urllib и Python 2.6 имеют поддержку SSL, и ваш пример кода отлично работает для меня. Вероятно, ваш Python построен без поддержки SSL? Попробуйте переустановить Python 2.6 (или лучше 2.7) и использовать исходную сборку с python.org.

В Google App Engine попробуйте использовать API напрямую:

from google.appengine.api import urlfetch

url = "https://www.google.com/"
result = urlfetch.fetch(url)
if result.status_code == 200:
  doSomethingWithResult(result.content)
person leoluk    schedule 19.09.2010
comment
У меня есть Python 2.6, но, поскольку я использую GAE, это может наложить некоторые ограничения (потому что он создан для Python 2.5). - person Vladimir Keleshev; 19.09.2010
comment
Я расширил свой ответ; вы используете SDK Google? он не поддерживает Python 2.6, но путь в вашем примере C:\Python26\lib\urllib.py - person leoluk; 19.09.2010
comment
urllib, urllib2 и httplib не проверяют сертификат сервера при использовании HTTPS, что, к сожалению, не делает использование HTTPS безопасным. (Есть способы обойти это, но для этого нужно немного больше кода.) - person Bruno; 19.09.2010

Для поддержки SSL вам необходимо скомпилировать Python с OpenSSL. Например, под ubuntu lucid вы должны установить модуль libcurl4-openssl-dev, а затем пересобрать Python.

person axaroth    schedule 31.05.2011

Попробуйте вместо этого использовать urllib2.

У меня была такая же проблема с urllib на OSX 10.6 с использованием python 2.6.6 от macports. Переключение на urllib2 исправило это.

person s29    schedule 04.11.2010
comment
Как переключиться на urllib2? У меня такая же проблема на маке! - person Maverik; 12.08.2011
comment
Вам нужно импортировать urllib2 вместо urllib и переписать свой код, чтобы он подходил. Это похоже, но не то же самое. Проверьте документы Python. - person s29; 17.08.2011
comment
Еще одна вещь из памяти, которая вызывает аналогичную ошибку, — это наличие другого файла с именем ssl.py или ssl.pyc где-то на вашем пути к python. Переименуйте или удалите его. - person s29; 17.08.2011