【问题标题】:Scraping Wikipedia information (table)抓取维基百科信息(表格)
【发布时间】:2020-07-16 05:08:23
【问题描述】:

我需要在 Wikipedia 上按区域抓取有关 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'])

但是它不起作用(它返回一个空列表)。 我使用 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> 

(此字段应针对每个区域更改)

然后&lt;table class="wikitable sortable query-tablesortes"&gt;

您能否就如何获得这样的结果给我一些建议? 任何帮助和建议将不胜感激。

编辑:

例子:

我有一句话:comunediabbateggio。这个词包括Abbateggio。我想知道哪个地区可以与那个城市相关联,如果它存在的话。 来自 Wikipedia 的信息需要创建一个数据集,该数据集可以让我检查该字段并与某个地区的社区/城市相关联。 我应该期待的是:

WORD                         REGION/STATE
comunediabbateggio           Pescara

我希望这可以帮助你。抱歉,如果不清楚。 另一个可能会更好理解英语的例子如下:

除了上面的意大利语链接,您还可以考虑以下内容: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

【问题讨论】:

  • 您的调试尝试结果如何?
  • 我建议您将代码分解为函数并测试每个函数。这样您可以更轻松地进行调试,并免费养成良好的编程习惯!
  • 我看不到任何你用来定义为“com.append(results[x])”变量的变量
  • 我在 Shane 发表评论后更新了代码。但我离解决方案还很远(很遗憾)
  • 请先定义结果变量

标签: python web-scraping beautifulsoup


【解决方案1】:
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()

【讨论】:

  • 谢谢艾哈迈德,但不幸的是,您的代码没有回答我的问题。我需要获取可以让我关联Abbateggio': 'Pescara' -&gt; Abruzzo(列表+ zip)的信息。对于每个comune(例如Pescara),我需要city(例如Abbateggio)和region(例如Abruzzo)。
  • @Val 你的问题不清楚。从哪里获得?它是否在 HTML 源中,您想将其转换为 array 吗?
  • 我想创建一个数组/列表来存储有关 comune、city 和 region 的所有信息,以便稍后检查字符串是否包含元素(例如 comune 或 city 或 region),然后关联对应的区域。例如:我有一个像comunediabbateggio这样的词:这个词包括abbateggio。我需要创建一个新列来存储有关该元素/单词 (comunediabbateggio) 的区域 (Abruzzo) 的信息。从维基百科页面收集的信息需要创建一个包含所有可能的社区、城市和地区的数据集。
  • 我举了一个例子。如果不清楚,我很抱歉。我专注于举例说明我正在尝试做的事情,我没有给你一个输出的例子。 @αԋɱҽԃ αмєяιcαη
  • 如果您单击...的公社列表链接,则会有一个列出公社的表格,例如https://en.wikipedia.org/wiki/List_of_communes_of_the_Province_of_Agrigento。我提到的词(Abbateggio,Pescara)被用作参考,让人们更容易发现链接中的字段。我也不认识他们
猜你喜欢
  • 1970-01-01
  • 2015-06-25
  • 2019-05-24
  • 1970-01-01
  • 2019-06-04
  • 2020-07-27
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多