xpath имеет нулевое значение, которое портит списки - PullRequest
0 голосов
/ 03 мая 2018

Я собираю имена, адреса и количество автомобилей с веб-страницы, используя код ниже.

Тем не менее, время от времени число автомобилей равно нулю. Предположим в примере ниже, что восьмому дилеру возвращено нулевое количество автомобилей, поэтому возвращаемые списки выглядят примерно так:

Имена = a, b, c, d, e, f, g, h, i, j

address = aa, bb, cc, dd, ee, ff, gg, hh, ii, jj

автомобилей = 1,2,3,4,5,6,7,9,10

, где у дилера a по адресу aa есть 1 автомобиль, у дилера b по адресу bb - 2 автомобиля и т. Д., Но поскольку дилер h по адресу hh имеет нулевое значение автомобилей, он пропускается, и вместо этого код считает, что у дилера h 9 автомобилей и т. Д. у дилера i и адреса ii имеется 10 автомобилей, поэтому дилер j по адресу jj пропущен, поскольку список автомобилей исчерпан.

поэтому, где код возвращает нулевое значение автомобилей, как мне заменить его на 0? и поэтому в приведенном выше примере у дилера h и адреса hh будет 0 автомобилей, поэтому у дилера i по адресу ii будет 9, а у дилера j по адресу jj будет 10 автомобилей

import scrapy

from autotrader.items import AutotraderItem

class AutotraderSpider(scrapy.Spider):
    name = "autotrader"
    allowed_domains = ["autotrader.co.uk"]

    start_urls = ["https://www.autotrader.co.uk/car-dealers/search?advertising-location=at_cars&postcode=m43aq&radius=1500&forSale=on&toOrder=on&sort=with-retailer-reviews&page=822"]

    def parse(self, response):
        for sel in response.xpath('//ul[@class="dealerList__container"]'):
            names = sel.xpath('.//*[@itemprop="legalName"]/text() ').extract()
            names = [name.strip() for name in names]
            addresses = sel.xpath('.//li/article/a/div/p[@itemprop="address"]/text()').extract()
            addresses = [address.strip() for address in addresses]
            carss = sel.xpath('.//li/article/a/div/p[@class="dealerList__itemCount"]/span/text()').extract() 
            carss = [cars.strip() for cars in carss]
            result = zip(names, addresses, carss)
            for name, address, cars in result:
                item = AutotraderItem()
                item['name'] = name
                item['address'] = address
                item['cars'] = cars
                yield item

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Попробуйте, чтобы получить результаты. Вы можете использовать xpaths в своем проекте, как показано ниже:

class AutotraderSpider(scrapy.Spider):
    name = "autotrader"
    allowed_domains = ["autotrader.co.uk"]

    start_urls = ["https://www.autotrader.co.uk/car-dealers/search?advertising-location=at_cars&postcode=m43aq&radius=1500&forSale=on&toOrder=on&sort=with-retailer-reviews&page=822"]

    def parse(self, response):
        for items in response.xpath("//article[@class='dealerList__item']"):
            name = items.xpath(".//span[@itemprop='legalName']/text()").extract_first()
            address = ' '.join([' '.join(item.split()) for item in items.xpath(".//p[@class='dealerList__itemAddress']/text()").extract()])
            cars = items.xpath(".//span[@class='dealerList__itemCountNumber']/text()").extract_first()
            yield {"Name":name,"Address":address,"Cars":cars}

Частичный вывод:

Midland Motors Leicester Street, Burton-On-Trent, Staffordshire DE14 3BA 2
Ns Cars 69 Eldon Street, Burton-On-Trent, Staffordshire DE15 0LT 1
RS Sales Nottingham Ltd Unit 1 TRINITY PARK, RANDALL PARK WAY, Retford, Nottinghamshire DN22 7WF 1
Adc Ltd Unit 3 HUCKNALL LANE, Nottingham, Nottinghamshire NG6 8AJ 5
0 голосов
/ 03 мая 2018

Ваш цикл выбора немного сбивает с толку.

Здесь вы перебираете несортированные списки, где только один на возраст:

for sel in response.xpath('//ul[@class="dealerList__container"]'):

То, что вы хотите, это перебрать все элементы списка:

for sel in response.xpath('//li[@class="dealerList__itemContainer"]'):

Если вы зациклились таким образом, вы можете получить имена, адреса каждого отдельного элемента списка:

for sel in response.xpath('//li[@class="dealerList__itemContainer"]'):
    names = sel.xpath('.//*[@itemprop="legalName"]/text() ').extract()
    names = [name.strip() for name in names]
    addresses = sel.xpath('.//article/a/div/p[@itemprop="address"]/text()').extract()
    addresses = [address.strip() for address in addresses]
    carss = sel.xpath('.//article/a/div/p[@class="dealerList__itemCount"]/span/text()').extract() 
    carss = [cars.strip() for cars in carss]
    item = AutotraderItem()
    item['name'] = name
    item['address'] = address
    item['cars'] = cars
    yield item
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...