在 Python 中, urlliburllib2requests模块之间的区别是什么?为什么会有三个?它们看起来做同样的事情...

2010-01-07 03:26:35
问题评论:

无法在计划中,但如果您说的是有关他们使用 HTTP 访问引发另一个扳手将建议改为code.google.com/p/httplib2 (httplib2)。

请求是最好的。

是的使用的请求。...stackoverflow.com/questions/22676/

请求使用 urllib3.3 是一个更大的数字

回答:

我知道它已说过,但我强烈建议请求 python 包︰ http://docs.python-requests.org/en/latest/index.html

如果您使用过非 python 语言,您可能会想 urllib 和 urllib2 是简单易用、 较少的代码,并且功能强大,这就是我用来思考。但请求包是如此令人难以置信的有用且短,每个人都应该使用它。

首先,它支持完全 rest 风格的 API,并且非常简单,您︰

import requests
...

resp = requests.get('http://www.mywebsite.com/user')
resp = requests.post('http://www.mywebsite.com/user')
resp = requests.put('http://www.mywebsite.com/user/put')
resp = requests.delete('http://www.mywebsite.com/user/delete')

无论是否获得/后永远不需要再次对参数进行编码,它只是采用作为参数的字典,是好去。

userdata = {"firstname": "John", "lastname": "Doe", "password": "jdoe123"}
resp = requests.post('http://www.mywebsite.com/user', data=userdata)

再加上它甚至具有内置的 json 解码器 (再次强调,我知道 json.loads() 不是很多内容编写,但这确实是非常方便)︰

resp.json()

或者,如果您的响应数据只包含文本,请使用︰

resp.text

这是只是冰山一角。这是从请求站点功能的列表︰

  • 国际域和 Url
  • 保持加电和连接池
  • 持久性 Cookie 的会话
  • 浏览器式 SSL 验证
  • 基本/摘要式身份验证
  • 优雅的键值的 Cookie
  • 自动解压缩
  • Unicode 响应正文
  • 多部分的文件上传
  • 连接超时
  • .netrc 支持
  • 列表项
  • Python 2.6-3.4
  • 线程安全。

我选用这答案因为原始答案已经过时。因此,如果您想知道此答案为什么比答案与 76 upvotes,它因为请求的新领域事实上的方式做事情。

@PaulBiggar 说这番话是最好的回答。但它确实无法回答的问题。我这里是要找出有关 urllib 和 urllib2 之间的差异。特别是有关 url 编码功能。答案︰ 使用请求 !;)只是说您可能想要阐明问题。照,从 Crast 的答案实际上 does 回答完美。

@exhuma urllib2 尝试进一步抽象与 urllib2 的 url 请求。请求类,但是没有几个常用的实用程序时经常采用结合使用 urllib,并回答您的特定问题的原因是︰ 它有没有 url 编码功能,对于参数编码您将使用 urllib.urlencode(),编码您的 url 安全字符串将使用 urllib.quote()/quote_plus()。请求会为您处理的所有这些︰ 只需将未编码/未经 safe 字符串添加到 params dict 中;这是原因的大多数 python 用于说出它部分是原因的一个更好的替代方案。

以防一些其他发现这在 2016年,您可能要编写requests.post('http://www.mywebsite.com/user', data=userdata)和不requests.post('http://www.mywebsite.com/user', params=userdata)

ty @LGenzelis 我修复该 bug !看不到完全更改发生的时间,但至少 2015年。现在示例︰ docs.python-requests.org/en/latest/user/quickstart/... ;文档︰ docs.python-requests.org/en/latest/user/quickstart/...

urllib2 提供了一些额外的功能,即urlopen()函数允许您指定标头 (通常您不得不使用在过去,这是更为详细的 httplib。)更重要的是尽管 urllib2 提供对Request类,可提供一种更具声明性方法来执行请求的操作︰

r = Request(url='http://www.mysite.com')
r.add_header('User-Agent', 'awesome fetcher')
r.add_data(urllib.urlencode({'foo': 'bar'})
response = urlopen(r)

请注意, urlencode()只是 urllib,不 urllib2。

也是在 urllib2 中实现 URL 支持更高级的处理程序。简短的回答是,除非您正在使用旧版代码,您可能想要使用的 URL 开始从 urllib2,但您仍然需要对某些实用程序功能导入 urllib。

附赠答案Google 应用程序引擎,您可以使用任何的 httplib、 urllib 或 urllib2,但它们都只是 Google 的 URL 获取 API 包装。也就是说,现在仍可能会有相同的限制,例如,端口、 协议和允许的响应的长度。用于检索 HTTP Url,但是像预期的那样,您可以使用这些库的核心。

如何不会有人创建 url 使用 urllib2 编码的查询字符串?它是唯一的原因我使用 urllib 和我希望确保我所做的一切最新/最大的方法。

正如在我上面的示例中,您可以使用来自urllib2urlopen()Request,并使用从urllib urlencode()在使用这两个库,只要您确保使用正确的 urlopen 没有实际损害。[Urllib docs] [1] 是清除在该使用这是 acecepted 的用法。[1]: docs.python.org/library/urllib2.html#urllib2.urlopen

我知道这有点旧,但是任何人都没有任何更新此?看一看当前的 python 文档docs.python.org/library/urllib2.html#request-objects请求没有 add_body 方法。它也不起作用在 python 交互式提示符并引发 AttributeError

因此我纠正它,它应该已被 add_data。

我认为这答案是陈旧,既然超请求包是那里,所以我要改变我所选的答案。

urllib2.urlopen 接受请求类或实例的 url,而 urllib.urlopen 只接受一个 url。

类似的讨论在此处发生︰ http://www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-the-difference.html

我喜欢的urllib.urlencode函数,并且它不出现在urllib2中都存在.

>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'

只需注意,小心 urlencode 因为它不能直接处理 < unicode > 对象-您需要将它们发送到 urlencode (u'blá'.encode('utf-8'),或任何) 前对其进行编码。

@user18015︰ 我不认为这适用于 Python 3、 可以澄清?

通常应使用 urllib2,因为这使事情较易有时通过接受请求的对象,还会引发有关协议错误 URLException。与 Google App 引擎,不能使用任何一个。您必须使用 Google 在其沙盒的 Python 环境中提供的URL 获取 API

您所说的关于 appengine 并非完全如此。您可以实际使用 httplib、 urllib 和 urllib2 的应用程序引擎中现在 (它们是 url 获取,这样,更多的代码将与 appengine 兼容的包装)。

噢,必须为新。我失败的代码最后一次我尝试了,不得不重写以使用 fetch...

devsite.googleplex.com/appengine/docs/python/urlfetch/...

请输入您的翻译

What are the differences between the urllib, urllib2, and requests module?

确认取消