обновление: большое спасибо за ответы - помощь и все старания! некоторые дополнительные примечания, которые я добавил. ниже (в конце)
привет, я пытаюсь очистить все ссылки большой страницы Википедии из «Списка городов и Гемейндена в Баварии» в Википедии, используя Python. Проблема в том, что я не могу понять, как экспортировать все ссылки, содержащие слова «/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
Я думаю, стоит пройтись по ним и получить инфобокс. информацию, которую вы ищете, можно найти с помощью кода 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
....и так далее, и тому подобное - обратите внимание: благодаря этому я смогу пройти через мой вышеупомянутый парсер, который может получать данные из одного информационного окна.
обновлять
еще раз здравствуй, дорогой HedgeHog, здравствуй, дорогой Салман Кхан,
Прежде всего - большое спасибо за быструю помощь и вашу потрясающую поддержку. Рад, что вы меня расстроили. я очень очень рад. кстати. теперь, когда у нас есть все ссылки большой страницы Википедии из «Списка городов и гемейнденов в Баварии».
мне бы хотелось продолжить работу над извлечением информационного ящика - кстати. это будет общая задача, которая может быть интересна многим пользователям stackoverflow: заключение: см. главную страницу: https://de.wikipedia.org/wiki/Liste_der_St%C3%A4dte_und_Gemeinden_in_Bayern и подстраницу с информационным полем: ️ 🔁 https://de.wikipedia.org/wiki/Abenberg
и как я собираю данные:
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
Цель состоит в том, чтобы собрать все данные инфобокса(ов) со всех страниц.
import requests
from bs4 import BeautifulSoup
import pandas as pd
def fetch_city_links(list_url):
response = requests.get(list_url)
if response.status_code != 200:
print(f"Failed to retrieve the page: {list_url}")
return []
soup = BeautifulSoup(response.content, 'html.parser')
divs = soup.find_all('div', class_='column-multiple')
href_list = []
for div in divs:
li_items = div.find_all('li')
for li in li_items:
a_tags = li.find_all('a', href=True)
href_list.extend(['https://de.wikipedia.org' + a['href'] for a in a_tags])
return href_list
def scrape_infobox(url):
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
infobox = soup.find('table', {'class': 'infobox'})
if not infobox:
print(f"No infobox found on this page: {url}")
return None
data = {}
for row in infobox.find_all('tr'):
header = row.find('th')
value = row.find('td')
if header and value:
data[header.get_text(" ", strip=True)] = value.get_text(" ", strip=True)
return data
def main():
list_url = 'https://de.wikipedia.org/wiki/Liste_der_St%C3%A4dte_und_Gemeinden_in_Bayern'
city_links = fetch_city_links(list_url)
all_data = []
for link in city_links:
print(f"Scraping {link}")
infobox_data = scrape_infobox(link)
if infobox_data:
infobox_data['URL'] = link
all_data.append(infobox_data)
df = pd.DataFrame(all_data)
df.to_csv('wikipedia_infoboxes.csv', index=False)
if __name__ == "__main__":
main()
the Main Function:
def main():
list_url = 'https://de.wikipedia.org/wiki/Liste_der_St%C3%A4dte_und_Gemeinden_in_Bayern'
city_links = fetch_city_links(list_url)
all_data = []
for link in city_links:
print(f"Scraping {link}")
infobox_data = scrape_infobox(link)
if infobox_data:
infobox_data['URL'] = link
all_data.append(infobox_data)
df = pd.DataFrame(all_data)
df.to_csv('wikipedia_infoboxes.csv', index=False)
Ну, я думал, что эта функция организует процесс: она извлекает ссылки на города, очищает данные информационного поля для каждого города, и сохраняет собранные данные в DataFrame pandas. Наконец, он сохраняет DataFrame в файл CSV.
Кстати: я надеюсь, что это не приведет к уничтожению темы. Я надеюсь, что здесь все в порядке - этот расширенный вопрос - но если нет - я могу открыть новую тему! Спасибо за все






Ваш селектор неправильный.
Названия городов находятся в теге li, который, в свою очередь, находится под элементом div с классом column-multiple.
Сначала получите все элементы div с классом column-multiple, затем получите все элементы li из собранных элементов div, а затем получите атрибут href всех тегов a внутри.
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
.
.
.
Основная проблема в вашем примере кода заключается в том, что вам нужно ввести правильный адрес. В языковой версии «en» не указан желаемый контент, поэтому вам придется переключиться на «de».
Однако альтернативой было бы использование селекторов css в сочетании с пониманием dict.
from bs4 import BeautifulSoup as bs
import requests
res = requests.get("https://de.wikipedia.org/wiki/Liste_der_St%C3%A4dte_und_Gemeinden_in_Bayern#A")
soup = bs(res.text, "html.parser")
links = {
link.get_text(strip=True):
f'https://de.wikipedia.org{link.get('href')}'
for link in soup.select(f'div.column-multiple ul a')
}
print(links)
{'Amberg': 'https://de.wikipedia.org/wiki/Amberg_(Schwaben)', 'Ansbach': 'https://de.wikipedia.org/wiki/Ansbach',
...,
'Wülfershausen a.d.Saale': 'https://de.wikipedia.org/wiki/W%C3%BClfershausen_a.d.Saale', 'Zeil a.Main': 'https://de.wikipedia.org/wiki/Zeil_a.Main', 'Zell a.Main': 'https://de.wikipedia.org/wiki/Zell_a.Main'}
Привет, HedgeHog, прежде всего! Огромное спасибо за быструю помощь и потрясающую поддержку. Дорогой HedgeHog, теперь, когда у нас есть все ссылки на большую страницу в Википедии из «Списка городов и Гемейнденов в Баварии». Я бы хотел продолжить. и работа с извлечением инфобокса - что кстати. это будет общая задача, которая может быть интересна многим пользователям stackoverflow: вывод: см. главную страницу: de.wikipedia.org/wiki/… и подстраницу с информационным полем: de.wikipedia.org/wiki /Абенберг – рад услышать ваше мнение – привет
На эту тему уже есть несколько хороших вопросов и ответов. Так зачем создавать дубликаты, начните с простого поиска или уже данного ответа на один из ваших вопросов: stackoverflow.com/a/78480161/14460824 - Если возникают конкретные ошибки, вы всегда можете опубликовать новый, конкретный вопрос (️ 🔁 Как спросить ), включая ваш код как минимальный воспроизводимый пример.
Добрый день, дорогой HedgeHog, большое спасибо за быстрый ответ. И как всегда - пища для размышлений: спасибо за помощь и подсказки. Я углублюсь в возможное решение и - если возникнут какие-то конкретные ошибки - вернусь снова и задам новый, "более целенаправленный" вопрос... Еще раз спасибо. Хорошего дня.
здравствуйте, дорогой Салман Кхан, прежде всего – большое спасибо за быструю помощь и вашу потрясающую поддержку. Рад, что вы меня расстроили. кстати. теперь, когда у нас есть все ссылки большой страницы Википедии из «Списка городов и гемейнденов в Баварии». мне бы хотелось продолжить работу над извлечением информационного ящика - кстати. это будет общая задача, которая может быть интересна многим пользователям stackoverflow: вывод: см. главную страницу: de.wikipedia.org/wiki/… и подстраницу с информационным полем: de.wikipedia.org/wiki /Абенберг