Задать вопрос
@happyjuic

Как спарсить такой веб-сайт?

Понимаю, что вопрос, возможно глупый. Но я напряг все свои полторы извилины, и даже у новомодных ИИ попросил помочь с созданием алгоритма. Все бестолку.

Моя задача собрать названия школ и адреса их веб-сайтов. По сути я имею дело с веб-страницами двух типов, они могут выглядеть так:
1. Страница со списком городов/районов
2. Страница с адресами школ в указанном городе/районе

То есть адрес до искомой страницы может выглядеть как: Уфа->Дема->*Адреса школ
Или как: Янаул->*Адреса школ. Короче иерархия всегда случайная. Но адреса школ - всегда конечная точка

На страницах со списком городов/районов/республик я просто ищу все теги *a в теге *div, а на странице с адресами школ ищу теги *a в таблице.

Я не могу понять, как сделать это все рекурсивно без кучи вложенных циклов. Есть у кого идеи?
  • Вопрос задан
  • 227 просмотров
Подписаться 1 Простой 6 комментариев
Пригласить эксперта
Ответы на вопрос 1
@dim5x
ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
import requests
from bs4 import BeautifulSoup

def parse_table(div, results):
    # Ищем таблицы внутри данного div
    tables = div.find_all('table')
    for table in tables:
        rows = table.find_all('tr')
        for row in rows:
            cells = row.find_all('td')
            if cells:
                # Извлекаем название и ссылку
                name = cells[0].get_text(strip=True)
                link = cells[0].find('a')['href'] if cells[0].find('a') else None
                if link:
                    results[name] = link

def recursive_parse(url, visited, results):

    if url in visited:
        return
    visited.add(url)
    print('Парсим URL:', url)

    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    # Ищем все div с itemscope
    divs = soup.find_all('div', itemscope=True)
    for div in divs:
        parse_table(div, results)  # Парсим таблицы внутри найденного div

    # Ищем все ссылки на подстраницы
    links = soup.find_all('a', href=True)
    for link in links:

        sub_url = link['href']
        # Проверяем, что ссылка ведет на подстраницу и не является текущим URL
        if 'respublika_bashkortostan' in sub_url and sub_url.startswith('http') and sub_url != url:
            recursive_parse(sub_url, visited, results)

# Начальная URL
start_url = 'https://russiaschools.ru/respublika_bashkortostan/'
visited_urls = set()
results_dict = {}
recursive_parse(start_url, visited_urls, results_dict)


for name, link in results_dict.items():
    print(f'Название: {name}, Ссылка: {link}')


З.Ы. я не знаю могут ли быть одинаковые наименования (например МБДОУ ДС №5) в разных районах, поэтому или просто выводите на экран или записывайте вместе с названием района.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы