scrapy возвращает пустой объект - PullRequest
0 голосов
/ 10 июля 2020

Я использую селектор css и постоянно получаю ответ с пустыми значениями. Вот код.

import scrapy 

class WebSpider(scrapy.Spider):
name = 'activities'
start_urls = [
    'http://capetown.travel/events/'
]


def parse(self, response):
    all_div_activities = response.css("div.tribe-events-content")#gdlr-core-pbf-column gdlr-core-column-60 gdlr-core-column-first
    title = all_div_activities.css("h2.tribe-events-list-event-title::text").extract()#gdlr-core-text-box-item-content
    price = all_div_activities.css(".span.ticket-cost::text").extract()
    details = all_div_activities.css(".p::text").extract()
    yield {
        'title':title,
        'price':price,
        'details':details
    }

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Вот мой. Надеюсь, это поможет вам.

for item in response.css('div.tribe-events-event-content'): 
    print(item.css('a.tribe-event-url::text').get()) 
    print(item.css('span.ticket-cost::text').get()) 
    print(item.css('p::text').get()) 

Спасибо.

0 голосов
/ 10 июля 2020

В вашем коде вы хотите выбрать все события, но этот вывод будет списком, и вы не можете выбрать заголовок 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
              }

Примечания

  1. Использование оператора if для определения цены, потому что были элементы, которые не имели цены вообще, и поэтому ввод некоторой информации - хорошая идея. словарь, так как в заголовке есть пробел и прикрепленный \ n.

Совет

В качестве второстепенного момента Scrapy предлагает использовать методы get () и getall () вместо extract_first () и extract (). С помощью extract () не всегда можно узнать, будет ли вывод списком или нет, в этом случае вывод, который я получил, был списком. Вот почему scrapy docs предлагает вместо этого использовать get (). К тому же он немного компактнее. С get () вы всегда получите строку. Это также означало, что я мог разделить заголовок новой строки и пробел, как вы можете видеть в приведенном выше коде.

Еще один совет: если атрибут класса довольно длинный, используйте селектор * = до тех пор, пока частичный Выбранный вами атрибут обеспечивает уникальный результат для требуемых данных. Подробнее см. Здесь здесь .

Использование элементов вместо создания словаря может быть лучше при длительном выполнении, поскольку вы можете установить значения по умолчанию для данных, которые в некоторых событиях на странице вы соскребают и прочих событий это не так. Вы должны сделать это через конвейер (опять же, если вы этого не понимаете, не волнуйтесь). См. Документацию по элементам и здесь для получения дополнительной информации по элементам.

...