How to automate scraping wikipedia info box specifically and print the data using python for any wiki page? My task is to automate printing the wikipedia infobox data. And that said i found out that the infobox is a typical wiki-part. so if i get familiar on this part - then i have learned alot - for future tasks - not only for me but for many others more that are diving into the Topos of scraping-wiki pages. So this might be a general task - helpful and packed with lots of information for many others too.
here is my starting point in this "lesson": As an example,i did some tests (on the Trek wikipedia page ( https://en.wikipedia.org/wiki/Star_Trek) and there i extracte the infobox section from the right hand side and print them row by row on screen using python. I specifically want the info box - the example worked perfectly.
so i went on - and I have done the following:
import pandas
urlpage = 'https://de.wikipedia.org/wiki/Raiffeisenbank_Aidlingen'
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")
that works perfect - now we have a set of some pages - similar to the above mentioned:
if we take this: page we have about 600 records ( links ) on the list: https://de.wikipedia.org/wiki/Liste_der_Genossenschaftsbanken_in_Deutschland What I need is to extract all the pages for the traversal with depth 1.
top-page: https://de.wikipedia.org/wiki/Liste_der_Genossenschaftsbanken_in_Deutschland sub-page: https://de.wikipedia.org/wiki/Abtsgm%C3%BCnder_Bank with the information:
Staat Deutschland
Sitz Hauptstraße 13
73453 Abtsgmünd
Rechtsform eingetragene Genossenschaft
Bankleitzahl 600 696 73[1]
BIC GENO DES1 ABR[1]
Gründung 24. August 1890
Verband Baden-Württembergischer Genossenschaftsverband e.V.
Website abtsgmuender-bank.de
Geschäftsdaten 2022[2]
Bilanzsumme 217,5 Mio. Euro
Einlagen 170,0 Mio. Euro
Kundenkredite 107,9 Mio. Euro
Mitarbeiter 24
Geschäftsstellen 3
Mitglieder 4.669
Leitung
Vorstand Danny Dürrich
Karl Heinz Gropper
Aufsichtsrat Holger Wengert (Vors.)
next sub-page: https://de.wikipedia.org/wiki/Raiffeisenbank_Aidlingen with the information:
Logo der Genossenschaftsbanken Raiffeisenbank Aidlingen eG
Staat Deutschland
Sitz Hauptstraße 8
71134 Aidlingen
Rechtsform eingetragene Genossenschaft
Bankleitzahl 600 692 06[1]
BIC GENO DES1 AID[1]
Gründung 12. Oktober 1901
Verband Baden-Württembergischer Genossenschaftsverband e.V.
Website ihrziel.de
Geschäftsdaten 2022[2]
Bilanzsumme 268,0 Mio. EUR
Einlagen 242,0 Mio. EUR
Kundenkredite 121,0 Mio. EUR
Mitarbeiter 26
Geschäftsstellen 1 + 1 SB-GS
Mitglieder 3.196
Leitung
Vorstand Marco Bigeschi
Markus Vogel
Aufsichtsrat Thomas Rott (Vorsitzender)
and the following sub-pages: derived from the top-page: (note on this page, we have about 600 records ( links ) on the list: https://de.wikipedia.org/wiki/Liste_der_Genossenschaftsbanken_in_Deutschland
now we need to apply to all the sub-pages the following parser - and subsequently add the results into a dataframe and print it to screen
import pandas
urlpage = 'https://de.wikipedia.org/wiki/Raiffeisenbank_Aidlingen'
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")
here the list of the urls: that we want to work on :
/wiki/Volksbank_im_Wesertal
/wiki/Raiffeisenbank_Westallg%C3%A4u
/wiki/Raiffeisenbank_MEHR_Mosel_-_Eifel_-_Hunsr%C3%BCck_-_Region
/wiki/Volksbank_Sangerhausen
/wiki/Volksbank_Grebenhain
/wiki/Obersulm
/wiki/Raiffeisenbank_Regenstauf
/wiki/Damme_(D%C3%BCmmer)
/wiki/Volksbank_Westerstede
/wiki/VR-Bank_Westm%C3%BCnsterland
/wiki/Breisach_am_Rhein
/wiki/DKM_Darlehnskasse_M%C3%BCnster
/wiki/Scharnhauser_Bank
/wiki/Sitz_(juristische_Person)
/wiki/Volksbank_Gera_Jena_Rudolstadt
/wiki/Volksbank_Bocholt
/wiki/G%C3%B6rlitz
/wiki/Raiffeisen-Volksbank_Neustadt
Well with this set of URLS i do the following:
import requests
from bs4 import BeautifulSoup
import pandas as pd
# Function to parse data from Wikipedia page
def parse_wikipedia_page(url):
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
# Find the relevant content
infobox = soup.find("table", class_="toccolours toptextcells float-right infobox")
if not infobox:
return None
# Extract data from the infobox
data = {}
rows = infobox.find_all("tr")
for row in rows:
cells = row.find_all(["th", "td"])
if len(cells) == 2:
key = cells[0].text.strip()
value = cells[1].text.strip()
data[key] = value
return data
# List of URLs for Wikipedia pages
urls = [
'https://de.wikipedia.org/wiki/Volksbank_im_Wesertal',
'https://de.wikipedia.org/wiki/Raiffeisenbank_Westallg%C3%A4u',
'https://de.wikipedia.org/wiki/Raiffeisenbank_MEHR_Mosel_-_Eifel_-_Hunsr%C3%BCck_-_Region',
'https://de.wikipedia.org/wiki/Volksbank_Sangerhausen',
'https://de.wikipedia.org/wiki/Volksbank_Grebenhain',
'https://de.wikipedia.org/wiki/Obersulm',
'https://de.wikipedia.org/wiki/Raiffeisenbank_Regenstauf',
'https://de.wikipedia.org/wiki/Damme_(D%C3%BCmmer)',
'https://de.wikipedia.org/wiki/Volksbank_Westerstede',
'https://de.wikipedia.org/wiki/VR-Bank_Westm%C3%BCnsterland',
'https://de.wikipedia.org/wiki/Breisach_am_Rhein',
'https://de.wikipedia.org/wiki/DKM_Darlehnskasse_M%C3%BCnster',
'https://de.wikipedia.org/wiki/Scharnhauser_Bank',
'https://de.wikipedia.org/wiki/Sitz_(juristische_Person)',
'https://de.wikipedia.org/wiki/Volksbank_Gera_Jena_Rudolstadt',
'https://de.wikipedia.org/wiki/Volksbank_Bocholt',
'https://de.wikipedia.org/wiki/G%C3%B6rlitz',
'https://de.wikipedia.org/wiki/Raiffeisen-Volksbank_Neustadt'
]
# Initialize an empty list to store parsed data
all_data = []
# Parse each Wikipedia page and store the results
for url in urls:
parsed_data = parse_wikipedia_page(url)
if parsed_data:
all_data.append(parsed_data)
# Create a DataFrame from the parsed data
df = pd.DataFrame(all_data)
# Print the DataFrame
print(df)
this gives back the following:
Staat Sitz \
0 Deutschland Deutschland Osterstraße 1131863 Coppenbrügge
1 Deutschland Deutschland Alois-Stadler-Straße 288167 Gestratz
2 Deutschland Deutschland Koblenzer Straße 5256759 Kaisersesch
3 Deutschland Deutschland Göpenstraße 3506526 Sangerhausen
4 Deutschland Deutschland Hauptstraße 3936355 Grebenhain
5 Deutschland Deutschland Marktplatz 893128 Regenstauf
6 Deutschland Deutschland Peterstraße 1926655 Westerstede
7 Deutschland Deutschland Kupferstr. 2848653 Coesfeld
8 Deutschland Deutschland Breul 2648143 Münster
9 Deutschland Deutschland Raiffeisenstraße 2–473760 Ostfildern
10 Deutschland Deutschland Johannisplatz 707743 Jena
11 Deutschland Deutschland Meckenemstraße 1046395 Bocholt
12 Deutschland Deutschland Hagener Straße 4431535 Neustadt am Rübenberge
Rechtsform Bankleitzahl BIC \
0 eingetragene Genossenschaft 254 626 80[1] GENO DEF1 COP[1]
1 eingetragene Genossenschaft 733 698 23[1] GENO DEF1 WWA[1]
2 eingetragene Genossenschaft 570 691 44[1] GENO DED1 KAI[1]
3 eingetragene Genossenschaft 800 635 58[1] GENO DEF1 SGH[1]
4 eingetragene Genossenschaft 500 691 46[1] GENO DE51 GRC[1]
5 eingetragene Genossenschaft 750 618 51[1] GENO DEF1 REF[1]
6 eingetragene Genossenschaft 280 632 53[1] GENO DEF1 WRE[1]
7 eingetragene Genossenschaft 428 613 87[1] GENO DEM1 BOB[1]
8 eingetragene Genossenschaft 400 602 65[1] GENO DEM1 DKM[1]
9 eingetragene Genossenschaft 600 695 17[1] GENO DES1 SCA[1]
10 eingetragene Genossenschaft 830 944 54[1] GENO DEF1 RUJ[1]
11 eingetragene Genossenschaft 428 600 03[1] GENO DEM1 BOH[1]
12 eingetragene Genossenschaft 250 692 62[1] GENO DEF1 NST[1]
Gründung Verband \
0 31. Dezember 1886 Genoverband e.V.
1 1. April 1903 Genossenschaftsverband Bayern e.V.
2 1872 Genoverband e.V.
3 2. Dezember 1931 Genoverband e.V.
4 1880 Genoverband e. V.
5 6. Februar 1894 Genossenschaftsverband Bayern e.V.
6 2. Februar 1899 Genossenschaftsverband Weser-Ems e.V.
7 NaN Genoverband e.V.
8 24. Januar 1961 Genoverband e.V.
9 23. Oktober 1890 Baden-Württembergischer Genossenschaftsverband...
10 16. März 1857 Genoverband e.V.
11 1900 Genoverband e.V.
12 12. Januar 1920 Genoverband e.V.
Website Bilanzsumme Einlagen \
0 vb-iw.de 348,0 Mio. EUR 295,0 Mio. EUR
1 raiffeisenbank-westallgaeu.de 404,6 Mio. EUR 344,5 Mio. EUR
2 rb-mehr.de 855,0 Mio. EUR 689,0 Mio. EUR
3 volksbank-sangerhausen.de 176,6 Mio. EUR 155,7 Mio. EUR
4 vb-grebenhain.de 151,4 Mio. € 117,2 Mio. €
5 raiffeisenbank-regenstauf.de 315,1 Mio. Euro 240,4 Mio. Euro
6 vb-westerstede.de 495,5 Mio. EUR 290,8 Mio. EUR
7 www.vrbank-wml.de 3,5 Mrd. Euro 2,1 Mrd. Euro
8 dkm.de 4.827 Mio. EUR 3.682 Mio. EUR
9 scharnhauserbank.de 175,0 Mio. EUR 136,0 Mio. EUR
10 www.volksbank-vor-ort.de 1.828,5 Mio. EUR 1.504,6 Mio. EUR
11 vb-bocholt.de 1.695,0 Mio. EUR 1.145,0 Mio. EUR
12 raiffeisen-volksbank-neustadt.de 139,9 Mio. EUR 108,6 Mio. EUR
Kundenkredite Mitarbeiter Geschäftsstellen Mitglieder \
0 180,0 Mio. EUR 58 3 + 2 SB-GS 7.546
1 254,4 Mio. EUR 59 8 und 3 SB-GS 6.367
2 447,0 Mio. EUR 128 9 + 3 SB-GS 13.728
3 40,4 Mio. EUR 20 4 4.634
4 96,5 Mio. € 21 4 2.796
5 205,6 Mio. Euro 53 5 + 1 SB-GS 3.107
6 346,3 Mio. EUR 63 2 3.579
7 2,6 Mrd. Euro 361 20 über 48.000
8 1.759 Mio. EUR 137 1 1.566
9 124,0 Mio. EUR 9 1 1.020
10 1.108,3 Mio. EUR 247 15 Filialen + 20 SB-Stellen 34.653
11 1.354,0 Mio. EUR 218 7 + 7 SB-GS 22.676
12 74,9 Mio. EUR 24 2 1.763
Vorstand \
0 Illka Osterwald (Vors.)Marco Weßling
1 Martin Öfner (Vorstandssprecher)Hans-Peter Beyrer
2 Heinrich Josef BlümlingKarl Josef BrunnerElmar...
3 Carmen ClausDaniel Kubica
4 Martin WinterKarsten Beckmann
5 Stephan Hauf (Vorsitzender)Wolfgang Haas
6 Christian BlessenStefan Terveer
7 Carsten Düerkop (Vors.)Matthias EntrupBerthold...
8 Christoph Bickmann (Vors.)Gerrit Abelmann
9 Joachim Rapp (Vorstandsvorsitzender)Andreas Gi...
10 Falko Gaudig Torsten Narr Jens Luley Harald Ra...
11 Franz-Josef HeidermannMartin Wilms
12 Frank HahnMarkus Heumann
Aufsichtsrat
0 Andreas Voß (Vors.)
1 Kathrin Koch (Vorsitzende)
2 Günter Urwer (Vors.)
3 Anette Stelter (Vorsitzende)
4 Werner Müller (Vors.)
5 Barbara Eigl (Vorsitzende)
6 Ralf Denker (Vors.)
7 Helmut Rüskamp (Vors.)
8 Antonius Hamers (Vors.)
9 Thomas Durst (Vorsitzender)
10 Bernhard Schanze (Vors.)
11 Christoph Ernsten (Vors.)
12 Gilbert Herzig (Vorsitzender)
my question is the following: my approach looks a bit fancy - especially i did not manage to find a clever way to get all the urls from the first page: https://de.wikipedia.org/wiki/Liste_der_Genossenschaftsbanken_in_Deutschland
additionally - the final results - well they look a bit funny. i d love to bring that to a table that would be awesome.
What you need to do is first find all the url:s and then parse them one by one before putting them into a dataframe. Note that there are 1379 links and that it therefore takes some time to execute, even with the solution I provide using concurrentFutures:
import requests
from bs4 import BeautifulSoup
import pandas as pd
from concurrent.futures import ThreadPoolExecutor
def get_wikipedia_urls(main_url):
response = requests.get(main_url)
soup = BeautifulSoup(response.content, "html.parser")
links = soup.find_all("a", href=True)
base_url = "https://de.wikipedia.org"
urls = [base_url + link['href'] for link in links if link['href'].startswith("/wiki/") and ":" not in link['href']]
return urls
def parse_wikipedia_page(url):
try:
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
infobox = soup.find("table", class_="infobox")
if not infobox:
return None
data = {}
rows = infobox.find_all("tr")
for row in rows:
if row.find("th") and row.find("td"):
key = row.find("th").text.strip()
value = row.find("td").text.strip()
data[key] = value
data['URL'] = url
return data
except Exception as e:
print(f"Error parsing {url}: {e}")
return None
main_url = 'https://de.wikipedia.org/wiki/Liste_der_Genossenschaftsbanken_in_Deutschland'
urls = get_wikipedia_urls(main_url)
all_data = []
with ThreadPoolExecutor(max_workers=10) as executor:
results = list(executor.map(parse_wikipedia_page, urls))
all_data = [result for result in results if result]
df = pd.DataFrame(all_data)
print(df)
df.to_csv('wikipedia_infoboxes.csv', index=False)
which gives
Rechtsform Gründung \
0 eingetragener Verein 1972 in Bonn[1]
1 NaN NaN
2 e.V. 1. Januar 2009
3 NaN NaN
4 Eingetragener Verein 1893 in München
... ... ...
1374 eingetragene Genossenschaft 28. Februar 1972
1375 NaN NaN
1376 eingetragene Genossenschaft 13. Oktober 1925
1377 NaN NaN
1378 eingetragener Verein 1972 in Bonn[1]
Sitz Präsidentin \
0 Berlin, Deutschland Marija Kolak[2]
1 NaN NaN
2 Stuttgart (jur. Sitz ist Karlsruhe) NaN
3 NaN NaN
4 München NaN
... ... ...
1374 Kamp 1733098 Paderborn NaN
1375 NaN NaN
1376 Goltenkamp 958452 Witten NaN
1377 NaN NaN
1378 Berlin, Deutschland Marija Kolak[2]
Vorstand \
0 Daniel Quinten, Tanja Müller-Ziegler[3]
1 NaN
2 Carsten Eisele
3 NaN
4 Gregor Scheller (Vorstandsvorsitzender und Prä...
... ...
1374 Richard Böger (Vorsitzender)Jürgen Reineke
1375 NaN
1376 Volkmar Birx (Sprecher)Sylvia Oberwinster
1377 NaN
1378 Daniel Quinten, Tanja Müller-Ziegler[3]
Mitglieder \
0 818 (2022)
1 NaN
2 750 Genossenschaften und genossenschaftlich au...
3 NaN
4 1169[1] (Stand: 31. Dezember 2022)
... ...
1374 1.304
1375 NaN
1376 1.897
1377 NaN
1378 818 (2022)
Website \
0 www.bvr.de
1 NaN
2 www.wir-leben-genossenschaft.de
3 NaN
4 www.gv-bayern.de
... ...
1374 bkc-paderborn.de
1375 NaN
1376 kbwitten.de
1377 NaN
1378 www.bvr.de
URL \
0 https://de.wikipedia.org/wiki/Bundesverband_de...
1 https://de.wikipedia.org/wiki/Kreditwesengesetz
2 https://de.wikipedia.org/wiki/Baden-W%C3%BCrtt...
3 https://de.wikipedia.org/wiki/Karlsruhe
4 https://de.wikipedia.org/wiki/Genossenschaftsv...
... ...
1374 https://de.wikipedia.org/wiki/Bank_f%C3%BCr_Ki...
1375 https://de.wikipedia.org/wiki/Paderborn
1376 https://de.wikipedia.org/wiki/Spar-_und_Kredit...
1377 https://de.wikipedia.org/wiki/Witten
1378 https://de.wikipedia.org/wiki/Bundesverband_de...
Organisationstyp Präsident ... ISO 9362 \
0 NaN NaN ... NaN
1 NaN NaN ... NaN
2 Genossenschaftsverband Dr. Ulrich Theileis ... NaN
3 NaN NaN ... NaN
4 NaN NaN ... NaN
... ... ... ... ...
1374 NaN NaN ... NaN
1375 NaN NaN ... NaN
1376 NaN NaN ... NaN
1377 NaN NaN ... NaN
1378 NaN NaN ... NaN
Bankleitzahl BIC Verband Bilanzsumme \
0 NaN NaN NaN NaN
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 NaN NaN NaN NaN
4 NaN NaN NaN NaN
... ... ... ... ...
1374 472 603 07[1] GENO DEM1 BKC[1] Genoverband e.V. 5.180,0 Mio. EUR
1375 NaN NaN NaN NaN
1376 452 604 75[1] GENO DEM1 BFG[1] Genoverband e.V. 171,8 Mio. EUR
1377 NaN NaN NaN NaN
1378 NaN NaN NaN NaN
Einlagen Kundenkredite Geschäftsstellen \
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
... ... ... ...
1374 3.946,0 Mio. EUR 2.082,0 Mio. EUR 1
1375 NaN NaN NaN
1376 137,4 Mio. EUR 69,0 Mio. EUR 1
1377 NaN NaN NaN
1378 NaN NaN NaN
Aufsichtsrat Unternehmensleitung
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN
... ... ...
1374 Georg Rüter (Vorsitzender) NaN
1375 NaN NaN
1376 Ralf Napiwotzki (Vorsitzender) NaN
1377 NaN NaN
1378 NaN NaN
[1379 rows x 25 columns]