【问题标题】:Keyword Arguments in PythonPython中的关键字参数
【发布时间】:2013-08-16 01:02:33
【问题描述】:

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

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

【问题讨论】:

    标签: python beautifulsoup urllib2 keyword-argument


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢 我不太确定如何解释文档。 [, parameter] 究竟是什么意思(即为什么是这种类似列表的格式)?
    • @MEric [, parameter] 表示:parameter 是可选的。
    【解决方案2】:

    来自文档:

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

    你可以这样做:

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

    【讨论】:

    • 仅当data 的默认值确实是None(确实如此)。 (只是想让人们对这个问题普遍敏感,而不是在这种情况下。)
    【解决方案3】:

    urllib2的请求函数结构为:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 2010-10-23
      相关资源
      最近更新 更多