Соскоб Википедии информации (таблица) - PullRequest
0 голосов
/ 04 апреля 2020

Мне нужно было бы собрать информацию об Elenco dei comuni по регионам в Википедии. Я хотел бы создать массив, который позволит мне связать каждую комуну с соответствующим регионом, то есть что-то вроде этого:

'Abbateggio': 'Pescara' -> Abruzzo

Я попытался получить информацию, используя BeautifulSoup и requests следующим образом:

from bs4 import BeautifulSoup as bs
import requests

     with requests.Session() as s: # use session object for efficiency of tcp re-use
        s.headers = {'User-Agent': 'Mozilla/5.0'}
        r = s.get('https://it.wikipedia.org/wiki/Comuni_d%27Italia')
        soup = bs(r.text, 'html.parser')
        for ele in soup.find_all('h3')[:6]:
            tx = bs(str(ele),'html.parser').find('span', attrs={'class': "mw-headline"})
            if tx is not None:
                print(tx['id'])

однако это не работает (возвращает пустой список). Информация, которую я просмотрел с помощью Inspect of Google Chrome, следующая:

<span class="mw-headline" id="Elenco_dei_comuni_per_regione">Elenco dei comuni per regione</span> (table)

<a href="/wiki/Comuni_dell%27Abruzzo" title="Comuni dell'Abruzzo">Comuni dell'Abruzzo</a> 

(это поле должно измениться для каждого региона)

затем <table class="wikitable sortable query-tablesortes">

Не могли бы вы дать мне совет, как получить такие результаты? Будем благодарны за любую помощь и предложение.

РЕДАКТИРОВАТЬ:

Пример:

У меня есть слово: comunediabbateggio. Это слово включает в себя Abbateggio. Я хотел бы знать, какой регион может быть связан с этим городом, если он существует. Информация из Википедии должна создать набор данных, который позволит мне проверить поле и связать с городом / регионом регион. Я должен ожидать:

WORD                         REGION/STATE
comunediabbateggio           Pescara

Надеюсь, это поможет вам. Извините, если это было не ясно. Другой пример динамика Engli sh, который может быть немного лучше для понимания, является следующим:

Вместо приведенной выше ссылки на итальянский язык, вы также можете рассмотреть следующее: https://en.wikipedia.org/wiki/List_of_comuni_of_Italy. Для каждого региона (Ломбардия, Венето, Сицилия, ...) мне нужно было бы собрать информацию о list of communes of the Provinces. если вы нажмете ссылку List of Communes of ..., появится таблица со списком, например, https://en.wikipedia.org/wiki/List_of_communes_of_the_Province_of_Agrigento.

1 Ответ

1 голос
/ 04 апреля 2020
import re
import requests
from bs4 import BeautifulSoup
import pandas as pd
from tqdm import tqdm



target = "https://en.wikipedia.org/wiki/List_of_comuni_of_Italy"


def main(url):
    with requests.Session() as req:
        r = req.get(url)
        soup = BeautifulSoup(r.content, 'html.parser')

        provinces = [item.find_next("span").text for item in soup.findAll(
            "span", class_="tocnumber", text=re.compile(r"\d[.]\d"))]

        search = [item.replace(
            " ", "_") if " " in item else item for item in provinces]

        nested = []
        for item in search:
            for a in soup.findAll("span", id=item):
                goes = [b.text.split("of ")[-1]
                        for b in a.find_next("ul").findAll("a")]
                nested.append(goes)

        dictionary = dict(zip(provinces, nested))

        urls = [f'{url[:24]}{b.get("href")}' for item in search for a in soup.findAll(
            "span", id=item) for b in a.find_next("ul").findAll("a")]
    return urls, dictionary


def parser():
    links, dics = main(target)
    com = []
    for link in tqdm(links):
        try:
            df = pd.read_html(link)[0]
            com.append(df[df.columns[1]].to_list()[:-1])
        except ValueError:
            com.append(["N/A"])
    com = iter(com)
    for x in dics:
        b = dics[x]
        dics[x] = dict(zip(b, com))
    print(dics)


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