Аргументы ключевых слов в Python

Итак, я пытаюсь прочитать данные со страницы Википедии, используя urllib2/BeautifulSoup. Я скопировал этот код в терминал:

import urllib2

hdrs = { 'User-Agent': "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11" } 
req = urllib2.Request("http://en.wikipedia.org/wiki/List_of_United_States_mobile_phone_companies" , headers = hdrs)
fd = urllib2.urlopen(req) 

Это работает нормально. Однако, когда я делаю этот вызов (удаляя аргумент ключевого слова) вместо этого:

req = urllib2.Request("http://en.wikipedia.org/wiki/List_of_United_States_mobile_phone_companies" , hdrs)

Я получаю сообщение об ошибке:

 TypeError: must be string or buffer, not dict

Почему это происходит? Я думал, что аргументы ключевого слова необязательны в вызове функции. Спасибо за помощь!


person MEric    schedule 14.08.2013    source источник


Ответы (3)


Второй параметр для urllib2.Request — это данные, а не заголовок.

class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])

Чтобы указать заголовки без указания данных, вы должны использовать форму аргумента ключевого слова.

person falsetru    schedule 14.08.2013
comment
Спасибо, я не был так уверен в том, как интерпретировать документацию. Что именно означает [, параметр] (т.е. почему is в этом спископодобном формате)? - person MEric; 14.08.2013
comment
@MEric [, parameter] означает: parameter не является обязательным. - person falsetru; 14.08.2013

Из документации:

urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])

Ты можешь сделать это:

req = urllib2.Request("<url>", None, hdrs)
person bennihepp    schedule 14.08.2013
comment
Только если значение по умолчанию для data действительно равно None (что действительно так). (Просто хотел, чтобы люди были чувствительны к этой проблеме в целом, а не в этом случае.) - person glglgl; 14.08.2013

Структура функции запроса urllib2:

urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])

когда вы вызываете свои функции в python, вам нужно либо указать имя аргумента, например. urllib2.request(headers = hdrs, url = my_url)

или вам нужно указать аргументы в том порядке, в котором они указаны в определении функции.

Таким образом, в вашей второй функции python предполагает, что вы указываете hdrs в качестве значения параметра данных и, следовательно, несоответствие типа данных.

person shshank    schedule 14.08.2013