Python: правильный способ сформулировать try-except - PullRequest
0 голосов
/ 05 августа 2020

Я очищаю Tripadvisor с помощью Scrapy (https://www.tripadvisor.com/Hotel_Review-g189541-d15051151-Reviews-CitizenM_Copenhagen_Radhuspladsen-Copenhagen_Zealand.html).

Один из элементов, которые я собираю, - это количество и радиус достопримечательностей, а также количество и радиус ресторанов. Эта информация присутствует не всегда (https://www.tripadvisor.com/Hotel_Review-g189541-d292667-Reviews-Strandmotellet_Greve-Copenhagen_Zealand.html). Если его нет, я получаю это сообщение об ошибке: «IndexError: индекс списка вне допустимого диапазона» (https://pastebin.com/pphM8FSM)

Я безуспешно пытался написать конструкцию try-error:

try:
            nearby_restaurants0_attractions1_distance = response.css("._1aFljvmJ::text").extract()
except IndexError:
            nearby_restaurants0_attractions1_distance = [None,None]

items["hotel_nearby_restaurants_distance"] = nearby_restaurants0_attractions1_distance[1]
items["hotel_nearby_attractions_distance"] = nearby_restaurants0_attractions1_distance[2]

Большое спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Индексы списка отсчитываются от нуля, а не от единицы. Если вы ожидаете список из двух пунктов, вам нужно изменить последние две строки, чтобы использовать [0] и [1] вместо [1] и [2]:

items["hotel_nearby_restaurants_distance"] = nearby_restaurants0_attractions1_distance[0]
items["hotel_nearby_attractions_distance"] = nearby_restaurants0_attractions1_distance[1]

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

0 голосов
/ 06 августа 2020

Ответ для всех, кому интересно:

Scrapy ищет предметы в near_restaurants0_attractions1_distance, но если ничего не может быть найдено, он возвращает None. Таким образом, на этом этапе нет IndexError.

IndexError возникает позже, когда элементы выбирают только часть списка - чего, очевидно, нет, когда Scrapy вернул None-Object. [Pastebin также показывает в строке над IndexError, что проблема связана с элементами]

nearby_restaurants0_attractions1_distance = response.css("._1aFljvmJ::text").extract()
try:
    items["hotel_nearby_restaurants_distance"] = nearby_restaurants0_attractions1_distance[1]
except IndexError:
    items["hotel_nearby_restaurants_distance"] = None

try:
   items["hotel_nearby_attractions_distance"] = nearby_restaurants0_attractions1_distance[2]
except:
   items["hotel_nearby_attractions_distance"] = None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...