В вашем коде вы хотите выбрать все события, но этот вывод будет списком, и вы не можете выбрать заголовок et c с помощью extract () со списком, как вы пытаетесь сделать.
Вот почему вы не получаете нужные данные. Вам нужно будет использовать от l oop до l oop для каждого события на странице в вашем случае, перебирая all_div_activities
.
Код для скрипта
def parse(self,response):
all_div_activities = response.css('div.tribe-events-event-content')
for a in all_div_activities:
title = a.css('a.tribe-event-url::text').get()
if a.css('span.ticket-cost::text'):
price = a.css('span.ticket-cost::text').get()
else:
price = 'No price'
details = a.css('div[class*="tribe-events-list-event-description"] > p::text').get()
yield {
'title':title.strip(),
'price':price,
'details':details
}
Примечания
- Использование оператора if для определения цены, потому что были элементы, которые не имели цены вообще, и поэтому ввод некоторой информации - хорошая идея. словарь, так как в заголовке есть пробел и прикрепленный \ n.
Совет
В качестве второстепенного момента Scrapy предлагает использовать методы get () и getall () вместо extract_first () и extract (). С помощью extract () не всегда можно узнать, будет ли вывод списком или нет, в этом случае вывод, который я получил, был списком. Вот почему scrapy docs предлагает вместо этого использовать get (). К тому же он немного компактнее. С get () вы всегда получите строку. Это также означало, что я мог разделить заголовок новой строки и пробел, как вы можете видеть в приведенном выше коде.
Еще один совет: если атрибут класса довольно длинный, используйте селектор * = до тех пор, пока частичный Выбранный вами атрибут обеспечивает уникальный результат для требуемых данных. Подробнее см. Здесь здесь .
Использование элементов вместо создания словаря может быть лучше при длительном выполнении, поскольку вы можете установить значения по умолчанию для данных, которые в некоторых событиях на странице вы соскребают и прочих событий это не так. Вы должны сделать это через конвейер (опять же, если вы этого не понимаете, не волнуйтесь). См. Документацию по элементам и здесь для получения дополнительной информации по элементам.