Использование Scrapy для извлечения ссылок из Википедии - PullRequest
0 голосов
/ 23 февраля 2020

Я изучаю скрап и пытаюсь использовать его для очистки страницы ниже Википедии:

https://en.wikipedia.org/wiki/List_of_sovereign_states_in_the_2020s

Я хотел бы скрести каждую страну и гиперссылка, прикрепленная к этой стране и ниже, является моим кодом на данный момент:

import scrapy


class CountrypopSpider(scrapy.Spider):
    name = 'countryPop'
    allowed_domains = ['en.wikipedia.org']
    start_urls = ['https://en.wikipedia.org/wiki/List_of_sovereign_states_in_the_2020s']

    def parse(self, response):
        countries = response.xpath('//table//b//@title').extract()

        for country in countries:

            country_url = response.xpath('//table//b[contains(@href, 'Afghanistan')]').extract()

            yield {'countries': country}

В настоящее время он получает все страны из основной таблицы, а затем я хочу, чтобы через каждую из них я получил l oop. страны, используя название страны, чтобы получить URL. У меня возникли проблемы, хотя при поиске способа использования URL-адреса страны для поиска URL-адреса моя последняя попытка была выполнена с использованием метода contains ().

Буду благодарен за любые другие комментарии по поводу моего кода очистки.

Спасибо

1 Ответ

1 голос
/ 23 февраля 2020

Попробуйте это Подход 1

import scrapy

class CountrypopSpider(scrapy.Spider):
    name = 'countryPop'
    allowed_domains = ['en.wikipedia.org']
    start_urls = ['https://en.wikipedia.org/wiki/List_of_sovereign_states_in_the_2020s']


    def parse(self, response):
        coutries=200
        cnames=['Australia','Bhutan']
        noduplicateset= set()
        for cname in cnames:
            for title in response.xpath('//table[1]//a[contains(@title,'+cname+')]'):
                if cname not in noduplicateset:
                    yield {cname:'https://en.wikipedia.org'+title.css('a').get().split("\"")[1]}
                noduplicateset.add(cname)

Подход 2

import scrapy

class CountrypopSpider(scrapy.Spider):
    LOG_LEVEL = 'INFO'
    name = 'countryPop'
    allowed_domains = ['en.wikipedia.org']
    start_urls = ['https://en.wikipedia.org/wiki/List_of_sovereign_states_in_the_2020s']


    def parse(self, response):
        coutries=200
        cnames=['Australia','Bhutan']
        for i in range(5,coutries):
            for title in response.xpath('//*[@id="mw-content-text"]/div/table[1]/tbody/tr['+str(i+2)+']/td[1]/b/a'):
                name=title.css('a ::text').get()
                if name in cnames:
                    yield {name:'https://en.wikipedia.org'+title.css('a').get().split("\"")[1]}

Если вы выводите в файл json, он будет выглядеть так json file

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