Nano Hash - криптовалюты, майнинг, программирование

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

Я пытаюсь очистить сайт, который возвращает свои данные через Javascript. Код, который я написал с помощью BeautifulSoup, работает довольно хорошо, но в случайных точках во время парсинга я получаю следующую ошибку:

Traceback (most recent call last):
File "scraper.py", line 48, in <module>
accessible = accessible[0].contents[0]
IndexError: list index out of range

Иногда я могу очистить 4 URL-адреса, иногда 15, но в какой-то момент скрипт в конечном итоге дает сбой и выдает указанную выше ошибку. Я не могу найти закономерности в провале, поэтому я действительно в недоумении - что я делаю неправильно?

from bs4 import BeautifulSoup
import urllib
import urllib2
import jabba_webkit as jw
import csv
import string
import re
import time

countries = csv.reader(open("countries.csv", 'rb'), delimiter=",")
database = csv.writer(open("herdict_database.csv", 'w'), delimiter=',')

basepage = "https://www.herdict.org/explore/"
session_id = "indepth;jsessionid=C1D2073B637EBAE4DE36185564156382"
ccode = "#fc=IN"
end_date = "&fed=12/31/"
start_date = "&fsd=01/01/"

year_range = range(2009, 2011)
years = [str(year) for year in year_range]

def get_number(var):
    number = re.findall("(\d+)", var)

    if len(number) > 1:
        thing = number[0] + number[1]
    else:
        thing = number[0]

    return thing

def create_link(basepage, session_id, ccode, end_date, start_date, year):
    link = basepage + session_id + ccode + end_date + year + start_date + year
    return link



for ccode, name in countries:
    for year in years:
        link = create_link(basepage, session_id, ccode, end_date, start_date, year)
        print link
        html = jw.get_page(link)
        soup = BeautifulSoup(html, "lxml")

        accessible = soup.find_all("em", class_="accessible")
        inaccessible = soup.find_all("em", class_="inaccessible")

        accessible = accessible[0].contents[0]
        inaccessible = inaccessible[0].contents[0]

        acc_num = get_number(accessible)
        inacc_num = get_number(inaccessible)

        print acc_num
        print inacc_num
        database.writerow([name]+[year]+[acc_num]+[inacc_num])

        time.sleep(2)
24.01.2013

Ответы:


1

Вам нужно добавить обработку ошибок в свой код. При очистке большого количества веб-сайтов некоторые из них будут искажены или каким-то образом сломаны. Когда это произойдет, вы будете пытаться манипулировать пустыми объектами.

Просмотрите код, найдите все предположения, в которых, по вашему мнению, он работает, и проверьте на наличие ошибок.

Для этого конкретного случая я бы сделал так:

if not inaccessible or not accessible:
    # malformed page
    continue
24.01.2013
  • большое спасибо! :) обязательно добавит в мой код обработку ошибок, спасибо за совет! 25.01.2013

  • 2

    soup.find_all("em", class_="accessible"), вероятно, возвращает пустой список. Можешь попробовать:

    if accessible:
        accessible = accessible[0].contents[0]
    

    или в более общем плане:

    if accessibe and inaccesible:
        accessible = accessible[0].contents[0]
        inaccessible = inaccessible[0].contents[0]
    else:
        print 'Something went wrong!'
        continue
    
    24.01.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..