从维基百科页面的摘要部分获取链接:使用Python从此维基页面提取所有链接

问题描述 投票:0回答:1

Howdy,我正在尝试使用 python 从维基百科上的“Bayern 的城镇和 Gemeinden 列表”中抓取大型维基百科页面的所有链接。问题是我不知道如何将包含“/wiki/”一词的所有链接导出到我的 CSV 文件中。我已经习惯了Python,但有些东西对我来说还是有点陌生。有任何想法吗?这是我到目前为止所拥有的......

页面:

https://de.wikipedia.org/wiki/Liste_der_St%C3%A4dte_und_Gemeinden_in_Bayern#A from bs4 import BeautifulSoup as bs import requests res = requests.get("https://en.wikipedia.org/wiki/Liste_der_St%C3%A4dte_und_Gemeinden_in_Bayern#A") soup = bs(res.text, "html.parser") gemeinden_in_bayern = {} for link in soup.find_all("a"): url = link.get("href", "") if "/wiki/" in url: gemeinden_in_bayern[link.text.strip()] = url print(gemeinden_in_bayern)

结果看起来不太具体:

nt': 'https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement'} Kostenpflichtige Colab-Produkte - Hier können Sie Verträge kündigen

真正的目的 - 是像这样获取列表:

https://de.wikipedia.org/wiki/Abenberg https://de.wikipedia.org/wiki/Abensberg https://de.wikipedia.org/wiki/Absberg https://de.wikipedia.org/wiki/Abtswind

btw

:旁注:在上述子页面上,我在信息框中有信息 - 我可以收集这些信息。看一个例子: import pandas urlpage = 'https://de.wikipedia.org/wiki/Abenberg' data = pandas.read_html(urlpage)[0] null = data.isnull() for x in range(len(data)): first = data.iloc[x][0] second = data.iloc[x][1] if not null.iloc[x][1] else "" print(first,second,"\n")

运行完美,查看输出:

Basisdaten Basisdaten Koordinaten: 49° 15′ N, 10° 58′ OKoordinaten: 49° 15′ N, 10° 58′ O Bundesland: Bayern Regierungsbezirk: Mittelfranken Landkreis: Roth Höhe: 414 m ü. NHN Fläche: 48,41 km2 Einwohner: 5607 (31. Dez. 2022)[1] Bevölkerungsdichte: 116 Einwohner je km2 Postleitzahl: 91183 Vorwahl: 09178 Kfz-Kennzeichen: RH, HIP Gemeindeschlüssel: 09 5 76 111 LOCODE: ABR Stadtgliederung: 14 Gemeindeteile Adresse der Stadtverwaltung: Stillaplatz 1 91183 Abenberg Website: www.abenberg.de Erste Bürgermeisterin: Susanne König (parteilos) Lage der Stadt Abenberg im Landkreis Roth Lage der Stadt Abenberg im Landkreis Roth

也就是说,我发现信息框是一个典型的维基部分。因此,如果我熟悉这一部分 - 那么我就学到了很多 - 对于未来的任务 - 不仅对我来说,而且对许多其他正在深入研究抓取维基页面的拓扑的人来说。因此,这可能是一项一般任务 - 对许多其他人来说很有帮助并且包含大量信息。

到目前为止一切顺利:我有一个列表,其中包含指向很多信息框的页面:

https://de.wikipedia.org/wiki/Liste_der_St%C3%A4dte_und_Gemeinden_in_Bayern#A

我认为遍历它们并获取信息框是值得的。您要查找的信息可以通过遍历所有 findindgs 的 python 代码找到

https://de.wikipedia.org/wiki/Abenberg https://de.wikipedia.org/wiki/Abensberg https://de.wikipedia.org/wiki/Absberg https://de.wikipedia.org/wiki/Abtswind

...等等 - 注意:这样我就可以遍历上面提到的刮刀,它能够获取一个信息框的数据。

python pandas beautifulsoup request
1个回答
2
投票

城镇名称位于 li 标签中的标签中,而 li 标签又位于类为

column-multiple

的 div 下。

首先获取所有类为

column-multiple

的div,然后从聚集的div中获取所有li项,然后获取里面所有a标签的href属性。

url = "https://de.wikipedia.org/wiki/Liste_der_St%C3%A4dte_und_Gemeinden_in_Bayern"
response = requests.get(url)
if response.status_code == 200:
    soup = BeautifulSoup(response.content, 'html.parser')
    #find all the div elemnts with class column-multiple
    divs = soup.find_all('div', class_='column-multiple')
    href_list = []
    for div in divs:
        # Find all li elements within the div.column-multiple
        li_items = div.find_all('li')
        for li in li_items:
            #now get the href of all <a> tags in li items
            a_tags = li.find_all('a', href=True)
            href_list.extend([a['href'] for a in a_tags])
    for href in href_list:
        print(f"https://de.wikipedia.org{href}")

它将打印你想要的内容:

https://de.wikipedia.org/wiki/Amberg https://de.wikipedia.org/wiki/Ansbach https://de.wikipedia.org/wiki/Aschaffenburg https://de.wikipedia.org/wiki/Augsburg https://de.wikipedia.org/wiki/Bamberg . . .

© www.soinside.com 2019 - 2024. All rights reserved.