Ваш код содержит несколько ошибок и мест, требующих улучшения. Я постараюсь выделить основные из них и предложить решения:
1. Неправильный отступ в функции parsing: Код, начиная с page = requests.get(URL), должен быть сдвинут вправо, чтобы находиться внутри функции.
2. Использование except без указания типа исключения: В блоке try-except лучше явно указывать тип исключения, например, except Exception. Это позволяет избежать подавления неожиданных исключений и облегчает отладку.
3. Проверка наличия элементов на странице: Перед тем, как получать текст элемента, стоит проверять, нашёлся ли такой элемент на странице. Иначе при попытке обратиться к .text несуществующего объекта вы получите AttributeError.
4. Отсутствие главной функции или условия if name == "main": В конце файла желательно добавить проверку if name == "main", чтобы запускать код парсинга только в случае, когда скрипт выполнен напрямую.
5. Необработанные возможные исключения при запросах: Все вызовы requests.get() стоит оборачивать в блок try-except для обработки возможных ошибок сети или HTTP-ошибок.
6. Чрезмерное использование print для отладки: Вместо многочисленных вызовов print для всех найденных элементов желательно организовать сбор данных в структурированном виде, например, в список словарей, а уже затем выводить собранную информацию или сохранять в файл.
Для исправления проблемы с отступами и обработкой исключений ваш код функции parsing может выглядеть примерно так:
def parsing(URL: str):
try:
page = requests.get(URL)
page.raise_for_status() # Вызовет исключение при ошибочном ответе
html_page = bsop4(page.text, "lxml")
title_element = html_page.find('h2', class_='headline') or html_page.find('div', class_='b_ear-title')
if title_element:
title = title_element.text
else:
title = "Заголовок не найден"
print(f"Заголовок: {title}")
# Аналогично обработайте subtitle, times и другие элементы
except requests.RequestException as e:
print(f"Ошибка запроса: {e}")
except Exception as e:
print(f"Неизвестная ошибка: {e}")
Не забудьте также обернуть в try-except блоки кода, где выполняются HTTP-запросы, и проверять, успешно ли выполнен запрос (код ответа HTTP 200).
Как-то так! Удачи!?
import requests
from bs4 import BeautifulSoup as bsop4
from tqdm import tqdm
from datetime import datetime, timedelta
def parsing(URL: str):
page = requests.get(URL)
html_page = bsop4(page.text, "lxml")
try:
title = html_page.find('h2', class_='headline').text
except:
title = html_page.find('div', class_='b_ear-title').text
print(f"Заголовок: {title}")
subtitle = html_page.find("div", class_="b_ear-intro").text
print(f"Подзаголовок: {subtitle}")
times = html_page.find("time", class_="b_ear-time").text
times = times.split()
print(f"Дата: {times[0]}")
print(f"Время: {times[1]}")
text = ""
for item in html_page.find_all('div', class_='b_article-text'):
text += item.text
print(f'Текст новости: {text}')
tags = []
for item in html_page.find_all("a", class_="tag"):
tags.append(item.text)
print(f'Теги: {tags}')
def parse_urls(date_str: str) -> list:
urls: list = []
page = requests.get(f'https://www.gazeta.ru/politics/news/{date_str}/')
html_page = bsop4(page.text, "lxml")
for item in html_page.find_all('a', class_='b_ear-item'):
urls.append(item.get('href'))
return urls
start_date = datetime(2023, 1, 1)
end_date = datetime(2023, 12, 31)
delta = timedelta(days=1)
while start_date < end_date:
date_str = start_date.strftime('%Y/%m/%d')
print(parse_urls(date_str))
start_date += delta