Итерация возвращает тот же результат при сканировании - PullRequest
0 голосов
/ 07 февраля 2020

Я новичок в Scrapy и просматриваю руководство пользователя. Я делаю некоторые упражнения и застрял с этим вопросом. При переборе списка книг результаты всегда возвращают одну и ту же пару «ключ: значение» после итерации, несмотря на то, что на странице 20 различных элементов.

Это мой код:

import scrapy


class MyBooks(scrapy.Spider):
    name = 'bookstore'
    allowed_domains = ['books.toscrape.com']
    start_urls = ['http://books.toscrape.com']

    def parse(self, response):
        for book in response.xpath('//article[@class="product_pod"]'):
            yield {

                'title': book.xpath('//h3/a/text()').get(),
                'price': book.xpath('//p[@class="price_color"]/text()').get(),

            }

И вот мой результат:

2020-02-07 12:03:00 [scrapy.core.scraper] DEBUG: Scraped from <200 http://books.toscrape.com>
    {'title': 'A Light in the ...', 'price': '£51.77'}
    2020-02-07 12:03:00 [scrapy.core.scraper] DEBUG: Scraped from <200 http://books.toscrape.com>
    {'title': 'A Light in the ...', 'price': '£51.77'}
    2020-02-07 12:03:00 [scrapy.core.scraper] DEBUG: Scraped from <200 http://books.toscrape.com>
    {'title': 'A Light in the ...', 'price': '£51.77'}
    2020-02-07 12:03:00 [scrapy.core.scraper] DEBUG: Scraped from <200 http://books.toscrape.com>
    {'title': 'A Light in the ...', 'price': '£51.77'}
    2020-02-07 12:03:00 [scrapy.core.scraper] DEBUG: Scraped from <200 http://books.toscrape.com>
    {'title': 'A Light in the ...', 'price': '£51.77'}
    2020-02-07 12:03:00 [scrapy.core.scraper] DEBUG: Scraped from <200 http://books.toscrape.com>
    {'title': 'A Light in the ...', 'price': '£51.77'}
    2020-02-07 12:03:00 [scrapy.core.scraper] DEBUG: Scraped from <200 http://books.toscrape.com>

Почему это так? Где я не прав?

1 Ответ

0 голосов
/ 07 февраля 2020

Я не очень знаком с xpath селекторами, но по некоторым причинам похоже, что book.xpath('//h3/a/text()') и book.xpath('//p[@class="price_color"]/text()') возвращают список селекторов с данными каждой книги в них. Чтобы подтвердить это, вы можете вызвать .getall() вместо .get() для этих селекторов, вы увидите, что он возвращает список результатов каждой книги. Я работал с селекторами CSS, хотя:

    def parse(self, response):
        for book in response.xpath('//article[@class="product_pod"]'):
            yield {
                'title': book.css('h3').css('a::text').get(),
                'price': book.css('.price_color::text').get()
            }

Подробнее о селекторах можно прочитать здесь .

...