Python - 列表索引超出范围

0 投票
2 回答
1275 浏览
提问于 2025-04-17 10:44

这是个奇怪的问题。我找到一个可以下载文件的脚本,在我本地机器上用得很好,一直没有问题。但是,当我把它上传到HostGator的服务器后,每次执行这个脚本时都会出现错误,而在我本地机器上从来没有发生过这种情况。

Traceback (most recent call last):
  File "./SocialMonitor.py", line 39, in <module>
    file_size = int(meta.getheaders("Content-Length")[0])
IndexError: list index out of range

这是我运行的终端命令(在切换到python脚本目录后):

/opt/python27/bin/python2.7 ./SocialMonitor.py

最后,这是下载脚本直到出错的部分:

url = "http://dustinheroin.chompblog.com/index.php?cat=21&feed=rss2"

file_name = 'dustinstatus.xml'
u = urllib2.urlopen(url)
f = open(rootDir + "/feeds/" + file_name, 'wb')
meta = u.info()
file_size = int(meta.getheaders("Content-Length")[0])

我试着在网上搜索这个错误,但从来没有找到能帮我解决这个问题的结果。正如我之前说的,这种情况只在HostGator服务器上发生,而在我本地机器上从未出现过。我搞不清楚自己哪里出错了。任何帮助都非常感谢!

编辑 1:

按照建议,我在脚本获取头部信息之前添加了这两行代码。

print "Printing for Meta: " + str(meta)
print "Printg for Meta.GetHeaders: " + str(meta.getheaders("Content-Length")[0])

第一个命令返回了这个:

Printing for Meta: Date: Sat, 21 Jan 2012 04:03:26 GMT

但是第二个命令却返回了这个:

Traceback (most recent call last):
  File "./SocialMonitor.py", line 40, in <module>
    print "Printg for Meta.GetHeaders: " + str(meta.getheaders("Content-Length")[0])
IndexError: list index out of rang

现在,列表为空是可以理解的,但最大的问题是为什么会返回空?这是不是因为我在和网站同一台服务器上运行Python脚本?

2 个回答

0

你可以通过查看所有的头信息来找到一些线索:

>>> import urllib2 as urlmodule
>>> from pprint import pprint as pp
>>> url = "http://dustinheroin.chompblog.com/index.php?cat=21&feed=rss2"
>>> u = urlmodule.urlopen(url)
>>> meta = u.info()
>>> pp(meta.headers)
['Date: Sat, 21 Jan 2012 04:36:53 GMT\r\n',
 'Server: Apache mod_qos/9.69 mod_fcgid/2.3.6 mod_auth_passthrough/2.1 mod_bwlim
ited/1.4 FrontPage/5.0.2.2635\r\n',
 'Expires: Thu, 19 Nov 1981 08:52:00 GMT\r\n',
 'Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0\
r\n',
 'Pragma: no-cache\r\n',
 'X-Pingback: http://dustinheroin.chompblog.com/xmlrpc.php\r\n',
 'ETag: "ecae4ff5933219080eefaf5d7ef071ac"\r\n',
 'X-Mobilized-By: WordPress Mobile Pack 1.2.4\r\n',
 'Set-Cookie: PHPSESSID=19aa94f1362e971400ed688ada0bd8cd; path=/\r\n',
 'Set-Cookie: wpmp_switcher=desktop; expires=Sun, 20-Jan-2013 04:36:53 GMT; path
=/\r\n',
 'Set-Cookie: _percent_mobile_c=531880547167941_1327124213_1138162253296621; exp
ires=Sun, 20-Jan-2013 04:36:53 GMT; path=/\r\n',
 'Last-Modified: Sat, 21 Jan 2012 02:48:46 GMT\r\n',
 'Content-Type: text/xml; charset=UTF-8\r\n',
 'X-Cache: MISS from proxy5.mel.dft.com.au\r\n',
 'X-Cache-Lookup: MISS from proxy5.mel.dft.com.au:80\r\n',
 'Via: 1.1 proxy5.mel.dft.com.au:80 (Lusca/LUSCA_HEAD-r14809)\r\n',
 'Connection: close\r\n']
>>> print meta.getheaders("Content-Length")
[]
>>>

或者你也可以不管这些,直接尝试读取数据:

>>> guff = u.read()
>>> len(guff)
6179
>>> guff[:100]
'<?xml version="1.0" encoding="UTF-8"?>\n<rss version="2.0"\n\txmlns:content="ht
tp://purl.org/rss/1.0/mo'
>>> guff[-100:]
's-update-2/feed/</wfw:commentRss>\n\t\t<slash:comments>0</slash:comments>\n\t\t
</item>\n\t</channel>\n</rss>\n'
>>>
0

发生的情况是,当你从HostGator运行时,你没有收到任何带有“Content-Length”这个HTTP头的信息。这意味着你很可能根本无法从那里读取这个网址。

确认这一点最简单的方法是,尝试在HostGator内部使用Python控制台来获取页面内容(我不知道你是否有shell访问权限,这个是必须的)。

如果有的话,只需在交互模式下运行Python,然后试试下面的代码:

import urllib
html = urllib.urlopen("http://dustinheroin.chompblog.com/index.php?cat=21&feed=rss2").read()

print len(html)

如果结果是零,那就说明了——从他们的服务内部阻止了这个请求。

撰写回答