1

所以我正在尝试使用 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

为什么会这样?我认为关键字参数在函数调用中是可选的。谢谢您的帮助!

4

3 回答 3

5

urllib2.Request的第二个参数是数据,而不是标头。

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

要指定标题而不指定数据,您应该使用关键字参数形式。

于 2013-08-14T07:28:24.993 回答
2

urllib2 的请求函数的结构是:

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

当你在 python 中调用你的函数时,你需要给出参数的名称,例如urllib2.request(headers = hdrs, url = my_url)

或者您需要按照函数定义中给出的顺序提供参数。

因此,在您的第二个函数中,python 假定您将 hdrs 作为 data 参数的值,因此数据类型不匹配。

于 2013-08-14T07:36:02.370 回答
2

从文档中:

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

你可以这样做:

req = urllib2.Request("<url>", None, hdrs)
于 2013-08-14T07:28:15.283 回答