Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Ошибки в парсинге данных.

Кирилл Соколов Знаток (400), на голосовании 9 месяцев назад
Уважаемые питонисты! Пробую сделать парсер для новостного источника, чтобы собрать данные за год (тексты новостей, заголовки, теги и т.д.). Помогите с кодом! Какие в нём есть ошибки?
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
Голосование за лучший ответ
Цветикъ Мыслитель (8112) 10 месяцев назад
Пирсинг? Его лучше в нос, а не в данные
Виктор Баринов Гуру (3002) 10 месяцев назад
Сори я математику на английском не понимаю давай на русском
Илья Сахаров Мастер (1429) 10 месяцев назад
Ты лучше спроси на стак оверфлове, здесь ты, скорее всего, ответа не найдешь
День цементаМастер (1786) 10 месяцев назад
держу в курсе, на оверфлове сидят те же хэллоуворлдщики
bqlqmutoff Мыслитель (5429) 10 месяцев назад
В вашем коде есть несколько ошибок и мест, требующих уточнения или исправления:

1. Отступы: В Python отступы критически важны для определения блоков кода. Ваша функция `parsing` и цикл `while` должны иметь соответствующие отступы для содержимого функции и цикла.

2. Обработка исключений: Использование голого `except` не рекомендуется, так как это может скрыть другие ошибки. Лучше указывать конкретное исключение, например, `except AttributeError:`.

3. Переменная `URL` в функции `parsing` должна быть передана при вызове этой функции. Убедитесь, что вы вызываете функцию `parsing` с URL в качестве аргумента внутри цикла или в другом месте вашего кода.

4. Проверка наличия элементов: Прежде чем обращаться к `.text`, лучше проверить, нашел ли поиск какой-либо элемент, чтобы избежать `AttributeError`.

5. Необходимо добавить вызов функции `parsing` с URL, полученным из функции `parse_urls`. В текущем коде функция `parsing` нигде не вызывается.
Просветленный (31394) 10 месяцев назад
Ваш код содержит несколько ошибок и мест, требующих улучшения. Я постараюсь выделить основные из них и предложить решения:

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).

Как-то так! Удачи!?
Daniil Pavlov Ученик (167) 10 месяцев назад
В вашем коде есть несколько потенциальных ошибок и улучшений, которые стоит учесть:

1. В функции `parsing(URL: str):` в строке `page = requests.get(URL)` будет полезно добавить проверку на успешность запроса, чтобы обработать возможные ошибки связанные с доступом к веб-странице.

2. Лучше использовать более универсальное условие для поиска заголовка новости, например `title = html_page.find('h2').text or html_page.find('div', class_='b_ear-title').text`, чтобы избежать ошибок в случае изменения классов или структуры html.

3. Строка `text += item.text` в цикле парсинга текста новости в функции `parsing(URL: str)` может собирать весь текст в одну строку без разделения на абзацы. Рекомендуется использовать более подходящий метод для обработки текста или позже разделить его на абзацы.

4. В функции `parse_urls(date_str: str) -> list:` рекомендуется добавить проверку на успешность запроса страницы и получение ссылок. Также можно уточнить селектор для поиска ссылок, чтобы избежать лишних данных.

5. Для удобства парсинга данных за год рекомендуется упаковать результаты парсинга каждой новости в отдельный объект (например, словарь) и сохранять их в список.

6. Для более удобного отслеживания прогресса парсинга новостей можно использовать библиотеку `tqdm`.

7. После завершения парсинга всех страниц новостей, можно сохранить полученные данные в удобном формате, например в CSV-файл.

Надеюсь, эти рекомендации помогут вам улучшить ваш парсер! Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться.
Похожие вопросы