Загрузка...

Help me parse the website

Thread in Python created by tinec4actliv Dec 6, 2024. 120 views

  1. tinec4actliv
    tinec4actliv Topic starter Dec 6, 2024 23 Jul 26, 2022
    Понимаю, что вопрос, возможно глупый. Но я напряг все свои полторы извилины, и даже у новомодных ИИ попросил помочь с созданием алгоритма. Все бестолку.

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

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

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

    Я не могу понять, как сделать это все рекурсивно без кучи вложенных циклов. Есть у кого идеи?

    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/")
     
  2. 525
    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}")
     
    1. tinec4actliv Topic starter
      525, по чесночку, сам писал?
    2. 525
Top
Loading...