Python - индекс списка вне диапазона - PullRequest
0 голосов
/ 21 января 2012

Странный вопрос. Я нашел скрипт загрузки файлов, и уже довольно давно использую его на своей локальной машине без проблем. Однако после загрузки его на сервер 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

Это команда терминала, которую я запускаю (после CD в каталог скриптов 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 голосов
/ 21 января 2012

Вы можете получить подсказку при проверке всех заголовков:

>>> 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 голосов
/ 21 января 2012

Что происходит, когда вы запускаете его из hostgator, вы не получаете никакого контента с заголовком http "Content-Length" - это означает, что, скорее всего, вы вообще не сможете прочитать URL оттуда.

Самый простой способ подтвердить, что пытается получить содержимое страницы с помощью консоли Python из самого хоста (я не знаю, если у вас есть доступ к оболочке, это будет необходимо). Если у вас есть, просто запустите Python вв интерактивном режиме и попробуйте что-то вроде:

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

print len(html)

Если оно равно нулю, то это так - исходящий запрос блокируется изнутри их службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...