объект модуля urllib не вызывается

Это мой третий проект на Python, и я получил сообщение об ошибке: 'module object' is not callable.

Я знаю, что это означает, что я неправильно ссылаюсь на переменную или функцию. Но метод проб и ошибок не помог мне решить эту проблему.

import urllib

def get_url(url):
    '''get_url accepts a URL string and return the server response code, response headers, and contents of the file'''
    req_headers = {
        'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.A.B.C Safari/525.13',
        'Referer': 'http://python.org'}

    #errors here on next line
    request = urllib.request(url, headers=req_headers) # create a request object for the URL
    opener = urllib.build_opener() # create an opener object
    response = opener.open(request) # open a connection and receive the http response headers + contents

    code = response.code
    headers = response.headers # headers object
    contents = response.read() # contents of the URL (HTML, javascript, css, img, etc.)
    return code , headers, contents


testURL = get_url('http://www.urlhere.filename.zip')
print ("outputs: %s" % (testURL,))

Я использовал эту ссылку для справки: http://docs.python.org/release/3.0.1/library/urllib.request.html

Отслеживание:

Traceback (most recent call last):
  File "C:\Project\LinkCrawl\LinkCrawl.py", line 31, in <module>
    testURL = get_url('http://www.urlhere.filename.zip')
  File "C:\Project\LinkCrawl\LinkCrawl.py", line 21, in get_url
    request = urllib.request(url, headers=req_headers) # create a request object for the URL
TypeError: 'module' object is not callable

person danielpiestrak    schedule 07.10.2012    source источник
comment
Пожалуйста, включите трассировку, когда вы столкнетесь с ошибкой Python. Вставьте его и сделайте отступ, как в коде, с помощью кнопки {} на панели инструментов редактора.   -  person Martijn Pieters    schedule 07.10.2012
comment
Спасибо @MartijnPieters. Я обновил свой вопрос с трассировкой.   -  person danielpiestrak    schedule 07.10.2012


Ответы (3)


В Python 3 объект urllib.request является модулем. Вам нужно вызвать объекты, содержащиеся в этом модуле. Это важное изменение по сравнению с Python 2, и если вы используете пример кода, вам необходимо это учитывать.

Например, создание объекта Request и открывателя:

request = urllib.request.Request(url, headers=req_headers)
opener = urllib.request.build_opener()
response = opener.open(request)

Внимательно прочитайте документацию.

person Martijn Pieters    schedule 07.10.2012
comment
Спасибо, мои первые два проекта были на python 2.x в прошлом году. Я использовал модифицированную версию примера кода, который ссылался на urllib2, который, как я читал, теперь объединен в urllib. Теперь, когда я знаю об этой разнице, я обращу более пристальное внимание. - person danielpiestrak; 07.10.2012
comment
@Gimp: несколько модулей были объединены и/или разделены на новые пространства имен. urllib2 в Python 2 был разделен на urllib.error и urllib.request. Вы также можете просмотреть серию Что нового в Python 3.x. документов. - person Martijn Pieters; 07.10.2012
comment
В Python 2 мне пришлось использовать метод parse() из модуля urlparse. Однако в Python 3 вам нужно from urllib import parse, а затем использовать parse.urlparse(). Это здорово. Спасибо. - person Juan José Melero Gómez; 19.10.2016

urllib.request — это модуль. urllib.request.Request — это класс. Вызов модуля, как вы сейчас делаете, вызывает ошибку. Вероятно, вы захотите вызвать класс следующим образом:

request = urllib.request.Request(url, headers=req_headers)  # create a request object for the URL

Вы также, вероятно, захотите использовать build_opener из urllib.request, а не просто urllib:

opener = urllib.request.build_opener()  # create an opener object
person icktoofay    schedule 07.10.2012
comment
Спасибо, что нашли время ответить на мой вопрос, icktoofay. Я дал вам +1. Редактирование @Martijn было немного быстрее и помогло мне решить мои проблемы в первую очередь, давая представление о разнице между python 2.x и 3.x. Кажется, вы оба дали одинаковые ответы. Еще раз спасибо за ваше время и усилия. - person danielpiestrak; 07.10.2012

Это также происходит, если вы объявили возвращаемый метод как метод свойства, добавив аннотацию @property.

person SurajKj    schedule 25.01.2019