IndexError: вывести индекс из списка за пределы диапазона, пока реклама не будет обработана с помощью Beautifulsoup. - PullRequest
3 голосов
/ 17 апреля 2019

Я очищаю свой местный сайт для объявлений о покупке / аренде квартир.

В некоторых случаях я получаю ошибку IndexError: list index вне диапазона.

Я получаю ошибки, в то время как мой скребок встречает надстройку, у которой нет некоторых параметров.Обычно это Powierzchnia (размер), Liczba pokoi (количество комнат), Pietro (этаж), Rok budowy (год постройки - я не соскребаю)

Я думаю, что это из-за этого:

pietro = ogl.find_all('p', class_ ="list__item__details__icons__element__desc")[2].text 

если нет [2], который обычно является третьим параметром, выдается ошибка, что этот [2] находится вне диапазона.

Я пытался вставить if в цикл for, который проверял бы, есть ли такой параметр, и если нет, продолжал.Однако не смог пройти через это.

Я также пытался использовать его так:

Powierzchnia = zrzut.find_all('li', class_ = "list__item__details__icons__element details--icons--element--powierzchnia")[0].text

Этот не выдавал ошибку, но дал одинаковый размер для всех объявлений

Вотполный код:

from bs4 import BeautifulSoup
from requests import get
import pandas as pd
import itertools
import matplotlib.pyplot as plt


headers = ({'User-Agent':
            'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'})
link = 'https://ogloszenia.trojmiasto.pl/nieruchomosci/wi,100,dw,1d.html?' + str(strona)
r = get(link, headers = headers)
zupa = BeautifulSoup(r.text, 'html.parser')

ogloszenia= zupa.find_all('div', class_="list__item")

n_stron = 0
numer = 0
for strona in range(0,12):
    n_stron +=1
    for ogl in ogloszenia:
        tytul = ogl.find_all('h2', class_ ="list__item__content__title")[0].text
        powierzchnia = ogl.find_all('p', class_ ="list__item__details__icons__element__desc")[0].text
        liczba_pokoi = ogl.find_all('p', class_ ="list__item__details__icons__element__desc")[1].text
        pietro = ogl.find_all('p', class_ ="list__item__details__icons__element__desc")[2].text
        lokalizacja = ogl.find_all('p', class_ = "list__item__content__subtitle")[0].text
        cena = ogl.find_all('p', class_ = "list__item__price__value")[0].text
        cena_m = ogl.find_all('p', class_ = "list__item__details__info details--info--price")[0].text

        numer += 1
        print(numer)
        print(tytul)
        print('Powierzchnia: ' + powierzchnia )
        print('Lokalizacja: ' + lokalizacja )
        print('Liczba pokoi: ' + liczba_pokoi )
        print('Pietro: ' + pietro )
        print('Cena: ' + cena )
        print('Cena za metr kwadratowy: ' + cena_m +'\n')

Ответы [ 3 ]

2 голосов
/ 17 апреля 2019

Вы можете перехватить исключение IndexError и установить переменную на None или ''

try:
    powierzchnia = ogl.find_all('p', class_ ="list__item__details__icons__element__desc")[0].text
except IndexError:
    powierzchnia = ''

Вы можете столкнуться с этим и для других переменных. Просто повторите то же самое для каждого.

0 голосов
/ 17 апреля 2019

Попробуйте:

data = ogl.find_all('p', class_ ="list__item__details__icons__element__desc")
for idx,entry in enumerate(data):
    if idx == 0:
        print('powierzchnia {}'.format(entry.text))
    elif idx == 1:
        print('liczba_pokoi {}'.format(entry.text))
    else:
        print('pietro {}'.format(entry.text))
0 голосов
/ 17 апреля 2019

Я бы порекомендовал два изменения.

Сначала попробуйте выделить повторяющиеся команды в функции.

def findDetail(ogl, tag, class, index):
     return ogl.find_all(tag, class_ = class)[index].text

Затем, в случаях, когда индекс недоступен, вы можете обработатьэто с «попробовать-за исключением».Это стандартный способ обработки ошибок в Python:

def findDetail(ogl, tag, class, index):
    try:
        return ogl.find_all(tag, class_ = class)[index].text
    except IndexError:
        print(f”Could not find index {index} for {tag} with {class}”)
        return “”

Затем вызовите его с помощью:

for ogl in ogloszenia:
    tytul = findDetail(ogl, “h2”, “"list__item__content__title", 0)
    powierzchnia = findDetail(ogl, ‘p’, "list__item__details__icons__element__desc", 0)

И так далее.Если индекс не может быть найден, он просто напечатает пустую строку.

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