Группирование одних и тех же данных в одном словаре - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь вычеркнуть название страны, ВВП и население с этого сайта . Я использую Scrapy с Python 3.7. Проблема в том, что я получаю все данные о стране в словаре, все данные о ВВП в словаре и все данные о населении в словаре. Но я хочу соответствующие данные по стране, ВВП и населения в словаре.

Вот мой код:

import scrapy

class DebtByCountriesSpider(scrapy.Spider):
    name = 'debt_by_countries'
    allowed_domains = ['worldpopulationreview.com/countries/countries-by-national-debt']
    start_urls = ['https://worldpopulationreview.com/countries/countries-by-national-debt/']

    def parse(self, response):

        # countries = response.xpath("//td/a/text()").getall()

        countries = response.xpath("//tbody/tr/td/a/text()").getall()
        GDP = response.xpath("//tbody/tr/td[2]/text()").getall()
        population = response.xpath("//tbody/tr/td[3]/text()").getall()


        yield{
            "country_name": countries,
            "GDP": GDP,
            "population": population

        }

Вот вывод моего кода:

Output 1

Но вот что я хочу (включая население):

What I want

1 Ответ

1 голос
/ 24 апреля 2020

Используя zip, мы можем создать словарь для каждой страны и получить оттуда.

for country, gdp, pop in zip(countries, GDP, population):
    yield {"country_name": country, "GDP": gdp, "population": pop}

Причина, по которой ваш код не работает, заключается в том, что генератор просто выдаст один Огромный словарь, где каждое значение представляет собой весь список countries, GDP и population соответственно. Чтобы исправить это, вы захотите создать словарь для каждой страны и выдавать каждый элемент на каждый вызов next, как показано выше.

Чтобы проверить генератор, попробуйте

gen = parse(response) # or self.parse(response) depending on context
print(next(gen))
print(next(gen))

Каждый раз next вызывается, генератор выдаст другой словарь, соответствующий новой стране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...