Ошибка импорта: нет модуля с именем urllib2
Вот мой код:
import urllib2.request
response = urllib2.urlopen("http://www.google.com")
html = response.read()
print(html)
У меня возникла проблема при попытке выполнить этот код. Он используется для запроса страницы Google, но, вероятно, не работает должным образом. Можете помочь разобраться?
5 ответ(ов)
Для скрипта, работающего с Python 2 (протестированные версии 2.7.3 и 2.6.8) и Python 3 (версии 3.2.3 и 3.3.2+), можно использовать следующий код:
#! /usr/bin/env python
try:
# Для Python 3.0 и новее
from urllib.request import urlopen
except ImportError:
# Переход на urllib2 для Python 2
from urllib2 import urlopen
html = urlopen("http://www.google.com/")
print(html.read())
Таким образом, данный код обеспечивает совместимость с обеими версиями Python, позволяя вам работать с URL-адресами без необходимости изменения кода в зависимости от версии.
В версии 3.3 это не сработало для меня. Попробуйте вместо этого (каждый случай может быть уникален, и ваше значение может отличаться):
import urllib.request
url = "http://www.google.com/"
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
Убедитесь, что у вас установлено правильное соединение с интернетом и что сайт доступен.
Разница в автозаполнении (tab completion) для пакета urllib
между Python 2 и Python 3 довольно заметна. В Python 2 urllib
представляет собой единый модуль, который включает в себя множество функций и классов, и при вводе import urllib.
выводится длинный список доступного содержимого. Вот пример:
In [1]: import urllib
In [2]: urllib.
urllib.ContentTooShortError urllib.FancyURLopener urllib.getproxies urllib.urlopen
urllib.URLopener urllib.i urllib.splitport ...
Как видно, все элементы находятся в одном пространстве имен, и их много.
В Python 3 произошли значительные изменения: urllib
был реорганизован в несколько подмодулей, таких как urllib.error
, urllib.parse
, urllib.request
и urllib.response
. А вот пример использования автозаполнения в Python 3:
In [2]: import urllib.
urllib.error urllib.parse urllib.request urllib.response urllib.robotparser
Если мы углубимся в подмодули, например, urllib.error
, мы увидим следующее:
In [2]: import urllib.error.
urllib.error.ContentTooShortError urllib.error.HTTPError urllib.error.URLError
А для urllib.request
:
In [2]: import urllib.request.
urllib.request.AbstractBasicAuthHandler urllib.request.HTTPBasicAuthHandler
urllib.request.Request urllib.request.urlopen
urllib.request.ProxyHandler urllib.request.HTTPHandler
Таким образом, в Python 3 структура более модульная и организованная, что облегчает поиск нужной функциональности. Если у вас есть старый код на Python 2, нужно учитывать эти изменения при миграции на Python 3.
Вы можете использовать следующие примеры кода для доступа к веб-страницам с помощью Python 3 и Python 2. Обратите внимание, что в каждой версии используются разные подходы.
Для Python 3:
import urllib.request
wp = urllib.request.urlopen("http://google.com")
pw = wp.read()
print(pw)
В этом коде мы используем urllib.request
для открытия URL. Метод urlopen
возвращает объект ответа, из которого мы читаем содержимое с помощью read()
. Оно, в свою очередь, выводится на экран с помощью функции print()
.
Для Python 2:
import urllib
import sys
wp = urllib.urlopen("http://google.com")
for line in wp:
sys.stdout.write(line)
В этом примере мы используем модуль urllib
и в цикле читаем строку за строкой. Каждая строка выводится в стандартный вывод с помощью sys.stdout.write()
.
Если вы провели тестирование обоих примеров и у вас возникли вопросы или нужны разъяснения, пожалуйста, дайте знать!
Вместо использования:
import urllib2
используйте следующий код в Python 3:
import urllib.request as urllib2
Это связано с тем, что в Python 3 модуль urllib
был реорганизован, и urllib2
больше не существует как отдельный модуль. Вместо этого необходимые функции можно найти в urllib.request
.
Как вернуть ключи словаря в виде списка в Python?
UnicodeDecodeError: Кодек 'charmap' не может декодировать байт X в позиции Y: символ отображается как <неопределённый>
Ошибка: "'dict' объект не имеет метода 'iteritems'"
Как лучше всего удалить акценты (нормализовать) в строке Unicode Python?
Список атрибутов объекта