Понимаю, что вопрос, возможно глупый. Но я напряг все свои полторы извилины, и даже у новомодных ИИ попросил помочь с созданием алгоритма. Все бестолку. Моя задача собрать названия школ и адреса их веб-сайтов. По сути я имею дело с веб-страницами двух типов, они могут выглядеть так: 1. Страница со списком городов/районов 2. Страница с адресами школ в указанном городе/районе То есть адрес до искомой страницы может выглядеть как: Уфа->Дема->*Адреса школ Или как: Янаул->*Адреса школ. Короче иерархия всегда случайная. Но адреса школ - всегда конечная точка. На страницах со списком городов/районов/республик я просто ищу все теги *a в теге *div, а на странице с адресами школ ищу теги *a в таблице. Я не могу понять, как сделать это все рекурсивно без кучи вложенных циклов. Есть у кого идеи? import requests from bs4 import BeautifulSoup import threading def is_end_point(page): if page.find("table") == None: return False else: return True def parse(URL): page = requests.get(URL).text bs = BeautifulSoup(page, "lxml") page = bs.find("div", class_="contents") queue = [] if is_end_point(page): for i in page.find_all("a"): queue.append(i) print(type(queue[0])) else: for i in page.find_all("a"): pass if __name__=="__main__": parse("https://russiaschools.ru/respublika_bashkortostan/birsk/") Python import requests from bs4 import BeautifulSoup import threading def is_end_point(page): if page.find("table") == None: return False else: return True def parse(URL): page = requests.get(URL).text bs = BeautifulSoup(page, "lxml") page = bs.find("div", class_="contents") queue = [] if is_end_point(page): for i in page.find_all("a"): queue.append(i) print(type(queue[0])) else: for i in page.find_all("a"): pass if __name__=="__main__": parse("https://russiaschools.ru/respublika_bashkortostan/birsk/")
import requests from bs4 import BeautifulSoup def is_end_point(page): """Проверка, является ли страница конечной (с адресами школ).""" return page.find("table") is not None def parse_page(url): """Обработка страницы: рекурсивно обходит ссылки, пока не дойдет до конечных страниц.""" try: response = requests.get(url) response.raise_for_status() except requests.RequestException as e: print(f"Ошибка при запросе {url}: {e}") return [] bs = BeautifulSoup(response.text, "lxml") contents = bs.find("div", class_="contents") if not contents: print(f"Контент не найден на странице {url}") return [] if is_end_point(contents): # Если страница с адресами школ, извлекаем ссылки return [(a.text.strip(), a["href"]) for a in contents.find_all("a") if "href" in a.attrs] # Если страница со списком городов/районов, рекурсивно обходим ссылки results = [] for a in contents.find_all("a", href=True): sub_url = a["href"] if not sub_url.startswith("http"): # Обработка относительных ссылок sub_url = requests.compat.urljoin(url, sub_url) results.extend(parse_page(sub_url)) return results if __name__ == "__main__": start_url = "https://russiaschools.ru/respublika_bashkortostan/birsk/" schools = parse_page(start_url) for name, link in schools: print(f"{name}: {link}") Python import requests from bs4 import BeautifulSoup def is_end_point(page): """Проверка, является ли страница конечной (с адресами школ).""" return page.find("table") is not None def parse_page(url): """Обработка страницы: рекурсивно обходит ссылки, пока не дойдет до конечных страниц.""" try: response = requests.get(url) response.raise_for_status() except requests.RequestException as e: print(f"Ошибка при запросе {url}: {e}") return [] bs = BeautifulSoup(response.text, "lxml") contents = bs.find("div", class_="contents") if not contents: print(f"Контент не найден на странице {url}") return [] if is_end_point(contents): # Если страница с адресами школ, извлекаем ссылки return [(a.text.strip(), a["href"]) for a in contents.find_all("a") if "href" in a.attrs] # Если страница со списком городов/районов, рекурсивно обходим ссылки results = [] for a in contents.find_all("a", href=True): sub_url = a["href"] if not sub_url.startswith("http"): # Обработка относительных ссылок sub_url = requests.compat.urljoin(url, sub_url) results.extend(parse_page(sub_url)) return results if __name__ == "__main__": start_url = "https://russiaschools.ru/respublika_bashkortostan/birsk/" schools = parse_page(start_url) for name, link in schools: print(f"{name}: {link}")