所以我试图使用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
为什么会这样?我认为关键字参数在函数调用中是可选的。谢谢你的帮助!
答案 0 :(得分:5)
urllib2.Request的第二个参数是数据,而不是标题。
class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])
要指定标题而不指定数据,您应该使用关键字参数形式。
答案 1 :(得分:2)
来自文档:
urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])
你可以这样做:
req = urllib2.Request("<url>", None, hdrs)
答案 2 :(得分:2)
urllib2的请求函数的结构是:
urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])
当您在python中调用函数时,您需要提供参数的名称,例如urllib2.request(headers = hdrs, url = my_url)
或者您需要按照函数定义中给出的顺序提供参数。
因此,在你的第二个函数python中,假设你将hdrs作为data参数的值,因此数据类型不匹配。