【问题标题】:Python requests: "IndexError: list index out of range"Python 请求:“IndexError:列表索引超出范围”
【发布时间】:2018-02-04 22:37:40
【问题描述】:

请不要将其标记为以下内容的重复:Python requests giving errror: IndexError: list index out of range

我在尝试向以下位置发送 GET 时遇到上述错误:

http://astat.bugly.qq.com

我在给我请求的代码中使用的确切行是,也许我忽略了一些东西:

r = requests.get("http://"+url, stream=True, timeout=3)

astat.bugly.qq.com 被传递为 url

我正在从 csv 文件中读取 url,但我检查了它是否读取了适当的 url。

我什至可以多次重新创建 python-REPL,我希望你也可以。 证明:

我不知道是什么原因造成的。

【问题讨论】:

  • 无法复制您的问题 - 您安装了哪个版本的 requests
  • 我可以用 Python 2.7.13 复制它,请求 2.18.3,在 win10 上。
  • .. 以及请求 2.18.4。
  • 当返回格式错误的标头时,python2 版本中的 urllib3 似乎存在问题。这是一个已知的错误:github.com/shazow/urllib3/issues/950
  • 注意:来自此网络服务器的响应不是有效的 HTTP 响应,没有状态行。它至少应该有:HTTP/1.0 200 OK\n\nlb monitor page,但也应该有一个content-type="text/plain"。将来自网络服务器的响应修复为有效的 HTTP,否则您将无法依赖任何 http 库(它今天可能工作,但明天可能会中断)。

标签: python get python-requests


【解决方案1】:

有问题的 url 是一个纯文本文档,发送时没有任何标题。

请求库似乎坚持至少有一个标头(当您收到索引错误时,它正在执行headers[-1])。

我不确定你是否可以在请求中做任何事情来解决它,但你可以使用urllib

import urllib
txt = urllib.urlopen('http://astat.bugly.qq.com').read()

更新:

我的目标是从网站读取某些标题,考虑到这种情况,您建议我如何做?

服务器发送以下内容:

~$ telnet astat.bugly.qq.com 80
Trying 103.7.30.121...
Connected to astat-bugly-tgw4l.mig.tencent-cloud.net.
Escape character is '^]'.
GET / HTTP/1.1
HTTP/1.1 200 OK
                Date: Thu, 30 Aug 2012 12:01:27 GMT
                Server: Apache/2.2.17 (Unix) PHP/5.3.6
                Cache-Control: max-age=1800
                Keep-Alive: timeout=5, max=98
                Connection: Keep-Alive
                Transfer-Encoding: chunked
                Content-Type: text/plain; charset=UTF-8
                Copyright @ 1998 - 2012 Tencent. All Rights Reserved.
                Content-Length: 17

lb monitor page
Connection closed by foreign host.

如果不使用 telnet(或类似的低级别),我认为您不会很幸运地获得那些“标题”(当然不应该缩进,或者嵌入随机的版权字符串)。

【讨论】:

  • 这是底层 urllib3 库 - 已知问题:github.com/shazow/urllib3/issues/950
  • 发送的响应也没有标准的 HTTP 状态响应 - 所以不是有效的 HTTP。因此,虽然urllib 可能有效,但如果您没有有效的 HTTP 响应,则不能依赖它。
  • @AChampion 我同意,如果您控制服务器,那么修复 it 显然是正确的做法。
  • 我的目标是从网站读取某些标题,考虑到这种情况,您建议我如何做到这一点?
  • 看我的更新,我想我解决了,通过使用python3而不是我默认的python2.7安装,如果出现任何问题我会更新
猜你喜欢
  • 2016-08-25
  • 2017-04-05
  • 2012-07-15
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多