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
:旁注:在上述子页面上,我在信息框中有信息 - 我可以收集这些信息。看一个例子:
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
...等等 - 注意:这样我就可以遍历上面提到的刮刀,它能够获取一个信息框的数据。
城镇名称位于 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
.
.
.