Я новичок в Scrapy и пытаюсь сканировать Интернет, но элемент HTML состоит из многих DIV, которые имеют дублированное имя класса, например.

<section class= "pi-item pi-smart-group pi-border-color">

<section class="pi-smart-group-head">
    <h3 class = "pi-smart-data-label pi-data-label pi-secondary-font pi-item-spacing">
</section>

    <section class= "pi-smart-group-body">
        <div class="pi-smart-data-value pi-data-value pi-font pi-item-spacing">
            <a href="abc" title="!! What I want !!"> </a>
        </div>
    </section>
</section>

Моя проблема в том, что эта структура повторяется для многих других элементов, и когда я использую response.css, я получаю несколько элементов, которые мне не нужны.

(Обычно я хочу сканировать информацию о покемонах, например «Типы», «Виды» и «Способности» каждого покемона из https://pokemon.fandom.com/wiki/Bulbasaur, я получил URL-адреса для всех покемонов, но застрял в получении информации от каждого покемона)

1
aria 30 Авг 2020 в 01:54

2 ответа

Лучший ответ

Я попытался сделать этот scrapy проект для вас и получил результаты. Я вижу проблему в том, что вы использовали CSS. Вы можете очистить это, но гораздо эффективнее использовать селекторы Xpath. У вас есть больше возможностей для выбора конкретных тегов, которые вы хотите. Вот код, который я написал для вас. Не забывайте, что этот код я сделал быстро, чтобы получить ваши результаты. Это работает, но я сделал это таким образом, чтобы вам было легко понять это, поскольку вы новичок в scrapy. Пожалуйста, дайте мне знать, если это полезно

import scrapy


class PokemonSpiderSpider(scrapy.Spider):
    name = 'pokemon_spider'
    start_urls = ['https://pokemon.fandom.com/wiki/Bulbasaur']

    def parse(self, response):
        pokemon_type = response.xpath("(//div[@class='pi-data-value pi-font'])[1]/a/@title")
        pokemon_species = response.xpath('//div[@data-source="species"]//div/text()')
        pokemon_abilities = response.xpath('//div[@data-source="ability"]/div/a/text()')

        yield {
            'pokemon type': pokemon_type.extract(),
            'pokemon species': pokemon_species.extract(),
            'pokemon abilities': pokemon_abilities.extract()
        }

enter image description here

1
dram95 30 Авг 2020 в 02:14

Вы можете использовать выражение XPath с текстом свойства:

abilities = response.xpath('//h3[a[.="Abilities"]]/following-sibling::div[1]/a/text()').getall()
species = response.xpath('//h3[a[.="Species"]]/following-sibling::div[1]/text()').get()
1
gangabass 30 Авг 2020 в 12:16