Scrapy Python response.css 运行

Scrapy Python response.css loop

我正在尝试循环此网站上的每个报价:

https://www.tui.pl/wypoczynek/wyniki-wyszukiwania-samolot?pm_source=SG&pm_name=LSC&q=:price:byPlane:T:a:WAW:dF:6:dT:8:startDate:15.09.2018:endDate:30.09.2018:ctAdult:2:ctChild:0:tripType:WS&fullPrice=false

代码:

def start_requests(self):
    yield SplashRequest(
        url = 'https://www.tui.pl/wypoczynek/wyniki-wyszukiwania-samolot?pm_source=SG&pm_name=LSC&q=:price:byPlane:T:a:WAW:dF:6:dT:8:startDate:15.09.2018:endDate:30.09.2018:ctAdult:2:ctChild:0:amountRange:defaultAmountRange:minHotelCategory:defaultHotelCategory:tripAdvisorRating:defaultTripAdvisorRating:beach_distance:defaultBeachDistance:tripType:WS&fullPrice=false&page=0',
        args={'wait': 5.0}
    )

def parse(self, response):
    for item in response.css('div#offerPage'):
       print(item.css('div#offerPage h3 a ::text').extract())

输出:

['TUI MAGIC LIFE Waterworld', 'Riu Bambu', 'Ivana Palace', 'Kos Bay', 'Tia Maria', 'Rezydencja Villa List', 'Esperanto', 'Jupiter', 'Vezhen', 'Obzor Beach Resort', 'Palma', 'Victoria Palace', 'Chaika Beach', 'Fenix Beach', 'Globus', 'Erma', 'Sunset Resort', 'Palace', 'Trakia Garden', 'Perla Sun', 'Lilia', 'Poseidon', 'Garden of Eden', 'Park Hotel Continental', 'Hotel Karolina', 'Santa Marina Holiday Village', 'Semeli Hotel', 'Delfin', 'Lion Sunny Beach', 'Selena Beach', 'Mercury']

看起来我的输出在一个列表中。如何每隔 #offerPage 更改一次循环?

Scrapy selector docs。您正在使用 css,所以我们会坚持使用。

reponse.css() 选择生成单个元素列表,因为只有一个 #offerPage(id 是唯一的)。所以你在 parse() 中的 for 循环只执行一次,但是其中的选择器产生了一个包含很多元素的列表,因为你的第一个选择中有很多 h3 > a 元素。

您应该再深入到元素一级,以便 response.css() 为您的 parse() 循环生成不止一个元素。然后遍历。

def parse(self, response):

  # get list
  list = response.css('div#offerPage h3')

  #iterate over list
  for item in list:
    print(item.css('a::text').extract())