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

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

Кирилл Соколов Знаток (357), открыт 2 недели назад
Уважаемые питонисты! Пробую сделать парсер для новостного источника, чтобы собрать данные за год (тексты новостей, заголовки, теги и т.д.). Помогите с кодом! Какие в нём есть ошибки?
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
6 ответов
Цветикъ Гуру (2892) 2 недели назад
Пирсинг? Его лучше в нос, а не в данные
Виктор Баринов Гуру (2544) 2 недели назад
Сори я математику на английском не понимаю давай на русском
Илья Сахаров Мастер (1154) 2 недели назад
Ты лучше спроси на стак оверфлове, здесь ты, скорее всего, ответа не найдешь
День цементаМастер (1517) 2 недели назад
держу в курсе, на оверфлове сидят те же хэллоуворлдщики
bqlqmutoff Гуру (4020) 2 недели назад
В вашем коде есть несколько ошибок и мест, требующих уточнения или исправления:

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

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

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

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

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

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 Ученик (147) 2 недели назад
В вашем коде есть несколько потенциальных ошибок и улучшений, которые стоит учесть:

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-файл.

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