如何更改选择器scrapy?

时间:2018-07-18 16:14:40

标签: python-3.x web-scraping scrapy web-crawler scrapy-spider

如何更改选择器scrapy?在蜘蛛工作期间。

请看一下我的代码:

# -*- coding: utf-8 -*-
import scrapy
from kino.items import KinoItem


class KinopoiskSpider(scrapy.Spider):
    name = 'kinopoisk'
    allowed_domains = ['kinopoisk.ru']
    start_urls = ['https://www.kinopoisk.ru/afisha/new/city/1/']

    def parse(self, response):
        links = response.css('div.name>a').xpath('@href').extract()
        for link in links:
            yield scrapy.Request(response.urljoin(link), callback=self.parse_moov, dont_filter=True)

    def parse_moov(self, response):
        item = KinoItem()
        item['orgname'] = response.css('div#headerFilm>span::text').extract()
        item['name'] = response.css('h1.moviename-big::text').extract()
        item['rating'] = response.css('div.block_2>div.div1>a>span.rating_ball::text').extract()
        item['r_critic'] = response.css('div.ratingNum>span::text').extract()
        item['waiting'] = response.xpath('//*[@id="block_rating"]/div[1]/div[3]/a[1]/text()').extract()
        if item['waiting'] is None:
            item['waiting_two'] = response.xpath('//*[@id="block_rating"]/div[1]/div[2]/a[1]/text()').extract()
        item['runtime'] = response.css('td#runtime::text').extract()
        item['premiere'] = response.xpath('//*[@id="div_rus_prem_td2"]/div/span[1]/a[1]/text()').extract()
        item['info'] = response.css('div.brand_words.film-synopsys::text').extract()

        yield item

这里if item['waiting'] is None: item['waiting_two'] 不起作用。有人可以在这里建议一些帮助吗。

1 个答案:

答案 0 :(得分:1)

实际上,我认为这不是选择器问题。

extract()方法未提取任何内容时,它将返回一个空列表。空列表在Python中不是“无”。

例如:

(same result both in python 2 and python 3)
>>> a = []
>>> a is None
False
>>> not a
True

这意味着您应该将if item['waiting'] is None更改为if not item['waiting']

我打印项目的结果:

(orgin)
==========================
orgname: []
name: ['Килиманджара']
rating: []
r_critic: []
waiting: [] <==== This is the empty list that extract() returned.
runtime: ['75 мин. ', ' 01:15']
premiere: ['19 июля 2018']
info: ['Когда к\xa0тебе на\xa0свадьбу не\xa0приезжает жених, остается только одно\xa0\x97\xa0найти его. Именно так\xa0и поступает красавица Маруся, отправившись на\xa0поиски своего возлюбленного в\xa0его родной Азербайджан. И\xa0хорошо, что\xa0рядом есть дружная команда друзей, или\xa0не очень дружная и\xa0не совсем друзей. На\xa0такие приключения в\xa0Баку не\xa0рассчитывал никто из\xa0компании Маруси, как\xa0и сами жители.']
==========================

(changed, I print waiting_two before the others)
waiting_two: ['78%']
==========================
orgname: []
name: ['Килиманджара']
rating: []
r_critic: []
waiting: []
runtime: ['75 мин. ', ' 01:15']
premiere: ['19 июля 2018']
info: ['Когда к\xa0тебе на\xa0свадьбу не\xa0приезжает жених, остается только одно\xa0\x97\xa0найти его. Именно так\xa0и поступает красавица Маруся, отправившись на\xa0поиски своего возлюбленного в\xa0его родной Азербайджан. И\xa0хорошо, что\xa0рядом есть дружная команда друзей, или\xa0не очень дружная и\xa0не совсем друзей. На\xa0такие приключения в\xa0Баку не\xa0рассчитывал никто из\xa0компании Маруси, как\xa0и сами жители.']
==========================