抓取维基百科信息(表)

2024-09-30 05:25:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在维基百科上搜集每个地区关于Elenco dei comuni的信息。我想创建一个数组,允许我将每个comune关联到相应的区域,例如:

'Abbateggio': 'Pescara' -> Abruzzo

我尝试使用BeautifulSouprequests获取信息,如下所示:

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'])

但是它不起作用(它返回一个空列表)。 我使用Google Chrome的Inspect查看的信息如下:

<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。我想知道哪个地区可以与该城市联系起来,如果它存在的话。 来自Wikipedia的信息需要创建一个数据集,该数据集允许我检查该字段并将其与某个地区的comuni/cities关联。 我所期望的是:

WORD                         REGION/STATE
comunediabbateggio           Pescara

我希望这能帮助你。对不起,如果不清楚的话。 对于说英语的人来说,另一个可能更容易理解的例子如下:

<> P>而不是上面的意大利语链接,你也可以考虑如下: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


Tags: ofhttpsorg信息bswikiwikipediarequests
1条回答
网友
1楼 · 发布于 2024-09-30 05:25:28
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()

相关问题 更多 >

    热门问题