IndexError: индекс списка вне допустимого диапазона

В настоящее время я работаю над фрагментом кода, который работает для нескольких веб-сайтов, но при повторном запуске веб-сайта ниже я получаю сообщение об ошибке. IndexError: индекс списка вне допустимого диапазона. Сначала я думал, что мой xpath недействителен, но после дальнейшего изучения xpath я знаю, что он правильный. Мое единственное другое, хотя это то, что мне может потребоваться предоставить пользовательский агент браузера и т. Д., Чтобы имитировать доступ браузера к веб-сайту.

вот часть кода, которая терпит неудачу

def safeweb(host):
    print "[*] Launching Norton Safeweb plugin against " + host
    url = 'http://safeweb.norton.com/report/show?url=' + host
    r = requests.get(url)
    html = r.text 
    #print html
    parser = etree.HTMLParser()
    tree = etree.parse(StringIO.StringIO(html), parser)
    #reporting starts here
    summary = tree.xpath("//*[@id='siteSummary']/table/tbody/tr[1]/td[2]/div/div[1]/div[2]/div")
    #print len(summary)
    print "[*] Summary: " + summary[0].text

person JohnstoneTech    schedule 19.04.2013    source источник
comment
Пробовали ли вы добавить строку браузера User-Agent, чтобы узнать, дискриминирует ли сайт парсеры?   -  person Ian Stapleton Cordasco    schedule 19.04.2013
comment
как я уже упоминал в своем первоначальном посте, это была моя мысль, но нет, я еще не пробовал, попробую, спасибо. Сначала мне придется немного больше прочитать о библиотеке запросов.   -  person JohnstoneTech    schedule 19.04.2013
comment
Чтобы передать заголовок User-Agent, вы добавляете headers={'User-Agent': '...'} к своему вызову (после url), но, судя по вашему комментарию к ответу Мартейна, у вас проблема с выражением пути. Вы получите IndexError, выполнив также следующее: a = []; print a[0], так что ваш итоговый список почти наверняка будет пустым, если вы его распечатаете.   -  person Ian Stapleton Cordasco    schedule 19.04.2013
comment
Ура, что сэкономило мне некоторое время, я заметил, что меня заблокировали после нескольких прогонов в другом разделе кода, и я предполагаю, что спуфинг моего агента браузера теперь решит это. Я согласен, что это, вероятно, мое выражение, шляпа неправильная, но я не вижу, где я ошибаюсь. Еще раз спасибо   -  person JohnstoneTech    schedule 19.04.2013


Ответы (1)


Вы действительно должны использовать r.content, не r.text при работе с StringIO здесь.

r.text дает вам юникод, r.content дает вам необработанные байты. Далее нет необходимости использовать StringIO.StringIO, etree.fromstring(html) будет работать нормально. Еще лучше передать необработанный ответ на .parse():

tree = etree.parse(r.raw, parser)

и пусть синтаксический анализатор читает ответ напрямую.

Если вы по-прежнему получаете исключение IndexError, значит, ваше выражение XPath не соответствует ничему на странице. Вместо этого вам придется сохранить HTML-код и проанализировать его вручную, чтобы увидеть, чем отличается эта страница.

person Martijn Pieters    schedule 19.04.2013
comment
Спасибо за ваши предложения Мартейн. Я последовал вашему совету и использовал etree.fromstring(html). Я также пытался передать необработанный ответ, как вы упомянули, однако это привело к другим ошибкам. Я использовал python для сохранения html в файл для анализа, чтобы убедиться, что html python получает то же самое, что и мой браузер. Это было немного по-другому, однако мой код все еще возвращает ту же ошибку. - person JohnstoneTech; 19.04.2013