2013-08-14 1 views
1

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

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 

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

ответ

2

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

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

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

req = urllib2.Request("<url>", None, hdrs) 
+1

Только если значение defualt для 'data' действительно' None' (это действительно так). (Просто хотел, чтобы люди были чувствительны к этой проблеме вообще, а не в этом случае.) – glglgl

5

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

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

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

+0

Спасибо, что я не был так уверен в том, как интерпретировать документацию. Что означает [, параметр] означает (то есть, почему он находится в этом списке)? – MEric

+0

@MEric '[, parameter]' означает: 'параметр' является необязательным. – falsetru

2

Структура функции запроса urllib2 заключается в следующем:

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

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

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

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