Мой веб-скребок Python собирает много данных, а затем внезапно останавливается с помощью IndexError. Я пробовал разные страницы и настройки, но они останавливаются в случайных местах.

(часть) Мой код выглядит следующим образом

numListings = int(re.findall(r'\d+', numListingsRaw)[0])
numPages = math.ceil(numListings / 100)

print(numPages) 


for numb in range(1, numPages):
    pageSoup = make_soup("https://url" + str(numb) + "&pmax=5000&srt=df-a")
    containers = pageSoup.findAll("li", {"class":"occasion popup_click_event 
    aec_popup_click"})

for container in containers:

    ID = container.a["data-id"]
    titel = container["data-vrnt"].replace(",", "|")
    URL = container.a["href"]
    merk = container["data-mrk"]
    soort = container["data-mdl"]
    prijs = container.find("div", {"class":"occ_price"}).text.strip()

    ## Bouwjaar en km
    bouwjaarKM = container.span.text.strip().split(", ")
    bouwjaarRaw = bouwjaarKM[0].split(": ")
    bouwjaar = bouwjaarRaw[1]

    km_int = int(''.join(filter(str.isdigit, bouwjaarKM[1])))
    km = str(km_int)

    rest = container.find("div", {"class":"occ_extrainfo"}).text.strip()
    rest_split = rest.split(", ")
    brandstof = rest_split[0]
    inhoud = rest_split[1]
    vermogen = rest_split[2]
    transmissie = rest_split[3]
    carroserie = rest_split[4]
    kleur = rest_split[5]

Это точное сообщение об ошибке:

"Traceback (most recent call last):
File "Webscraper_multi2.py", line 62, in <module>
inhoud = rest_split[1]
IndexError: list index out of range"

Я знаю, что это как-то связано с циклом for, но я не могу разобраться с этим.

Ваша помощь очень ценится. Заранее спасибо,

Том

0
Thomson 25 Июн 2019 в 02:12

3 ответа

Лучший ответ

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

rest = container.find("div", {"class":"occ_extrainfo"}).text.strip()
rest_split = rest.split(", ")
if len(rest_split) >= 6:
    brandstof = rest_split[0]
    inhoud = rest_split[1]
    vermogen = rest_split[2]
    transmissie = rest_split[3]
    carroserie = rest_split[4]
    kleur = rest_split[5]

Если вы знаете, что ваш разделенный список имеет ту длину, которую вы хотите (if len(rest_split) == 6:), вы можете распаковать список в одну строку:

brandstof, inhoud, vermogen, transmissie, carroserie, kleur = rest_split
0
JacobIRR 24 Июн 2019 в 23:18

Спасибо всем за чрезвычайно быстрые ответы! С вашей помощью у меня все заработало.

Для некоторого контекста: я пытался поковырять подержанный автомобильный сайт. С советами, которые я получил, я изменил вывод для каждого элемента, чтобы напечатать список rest_split.

Список, который я пытаюсь очистить, состоит из 7 элементов. Но на сайте почему-то был добавлен мотоцикл в результаты поиска. У этого был только 1 элемент, отсюда и ошибка.

Решение для людей, которые могут иметь похожую проблему:

rest = container.find("div", {"class":"occ_extrainfo"}).text.strip()
rest_split = rest.split(", ")
if len(rest_split) == 7:
    brandstof = rest_split[0]
    inhoud = rest_split[1]
    vermogen = rest_split[2]
    transmissie = rest_split[3]
    carroserie = rest_split[4]
    kleur = rest_split[5]

Отдельное спасибо JacobIRR, который на самом деле сделал жизнь настолько легкой, что мне даже не пришлось об этом думать.

0
Thomson 25 Июн 2019 в 15:48

Выведите значение rest_split. Вы обнаружите, что это список с длиной менее 2, для этого необходим список с индексом 1.

0
Dan D. 24 Июн 2019 в 23:17