5

Ошибка импорта: нет модуля с именем urllib2

13

Вот мой код:

import urllib2.request

response = urllib2.urlopen("http://www.google.com")
html = response.read()
print(html)

У меня возникла проблема при попытке выполнить этот код. Он используется для запроса страницы Google, но, вероятно, не работает должным образом. Можете помочь разобраться?

5 ответ(ов)

1

Для скрипта, работающего с 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-адресами без необходимости изменения кода в зависимости от версии.

0

В версии 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'))

Убедитесь, что у вас установлено правильное соединение с интернетом и что сайт доступен.

0

Разница в автозаполнении (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.

0

Вы можете использовать следующие примеры кода для доступа к веб-страницам с помощью 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().

Если вы провели тестирование обоих примеров и у вас возникли вопросы или нужны разъяснения, пожалуйста, дайте знать!

0

Вместо использования:

import urllib2

используйте следующий код в Python 3:

import urllib.request as urllib2

Это связано с тем, что в Python 3 модуль urllib был реорганизован, и urllib2 больше не существует как отдельный модуль. Вместо этого необходимые функции можно найти в urllib.request.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь