Как очистить ссылки из сводного раздела/списка ссылок Википедии?

обновление: большое спасибо за ответы - помощь и все старания! некоторые дополнительные примечания, которые я добавил. ниже (в конце)

привет, я пытаюсь очистить все ссылки большой страницы Википедии из «Списка городов и Гемейндена в Баварии» в Википедии, используя 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.

Кстати: я надеюсь, что это не приведет к уничтожению темы. Я надеюсь, что здесь все в порядке - этот расширенный вопрос - но если нет - я могу открыть новую тему! Спасибо за все

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
94
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваш селектор неправильный.

Названия городов находятся в теге 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
.
.
.

здравствуйте, дорогой Салман Кхан, прежде всего – большое спасибо за быструю помощь и вашу потрясающую поддержку. Рад, что вы меня расстроили. кстати. теперь, когда у нас есть все ссылки большой страницы Википедии из «Списка городов и гемейнденов в Баварии». мне бы хотелось продолжить работу над извлечением информационного ящика - кстати. это будет общая задача, которая может быть интересна многим пользователям stackoverflow: вывод: см. главную страницу: de.wikipedia.org/wiki/… и подстраницу с информационным полем: de.wikipedia.org/wiki /Абенберг

zero 15.05.2024 21:27

Основная проблема в вашем примере кода заключается в том, что вам нужно ввести правильный адрес. В языковой версии «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 /Абенберг – рад услышать ваше мнение – привет

zero 15.05.2024 21:28

На эту тему уже есть несколько хороших вопросов и ответов. Так зачем создавать дубликаты, начните с простого поиска или уже данного ответа на один из ваших вопросов: stackoverflow.com/a/78480161/14460824 - Если возникают конкретные ошибки, вы всегда можете опубликовать новый, конкретный вопрос (️ 🔁 Как спросить ), включая ваш код как минимальный воспроизводимый пример.

HedgeHog 16.05.2024 22:12

Добрый день, дорогой HedgeHog, большое спасибо за быстрый ответ. И как всегда - пища для размышлений: спасибо за помощь и подсказки. Я углублюсь в возможное решение и - если возникнут какие-то конкретные ошибки - вернусь снова и задам новый, "более целенаправленный" вопрос... Еще раз спасибо. Хорошего дня.

zero 17.05.2024 10:23

Другие вопросы по теме