Очистка элементов веб-страницы с помощью Python

Я пытался улучшить свои познания в Python и считаю, что код довольно продвинутый. Однако мне не нравится стиль кодирования, который я использовал, когда я слишком много стараюсь, за исключением контента, который может быть не нужен на первом месте.

Моя цель в основном состоит в том, чтобы иметь готовую полезную нагрузку перед очисткой, как вы увидите в верхней части кода. Их всегда следует указывать перед очисткой. Что я пытаюсь сделать, так это попытаться очистить эти разные данные. Если мы не находим данные, он должен пропустить или установить значение на [], Нет или Ложь (в зависимости от того, что мы пытаемся сделать). Я прочитал abit относительно getattr и isinstance функций, но я не уверен, может ли быть лучший способ, чем использование большого количества Try, кроме как прикрытие, если он не находит элемент на веб-странице.

Буду признателен за любую помощь!

import requests
from bs4 import BeautifulSoup

payload = {
    "name": "Untitled",
    "view": None,
    "image": None,
    "hyperlinks": []
}

site_url = "https://stackoverflow.com/questions/743806/how-to-split-a-string-into-a-list"

response = requests.get(site_url)

bs4 = BeautifulSoup(response.text, "html.parser")

try:
    payload['name'] = "{} {}".format(
        bs4.find('meta', {'property': 'og:site_name'})["content"],
        bs4.find('meta', {'name': 'twitter:domain'})["content"]
    )
except Exception:  # noqa
    pass

try:
    payload['view'] = "{} in total".format(
        bs4.find('div', {'class': 'grid--cell ws-nowrap mb8'}).text.strip().replace("rn", "").replace(" ", ""))
except Exception:
    pass

try:
    payload['image'] = bs4.find('meta', {'itemprop': 'image primaryImageOfPage'})["content"]
except Exception:
    pass

try:
    payload['hyperlinks'] = [hyperlinks['href'] for hyperlinks in bs4.find_all('a', {'class': 'question-hyperlink'})]

except Exception:  # noqa
    pass

print(payload)

1 ответ
1

Короче говоря:

  • в программировании нет ничего хуже молчаливого проглатывания исключений 🙂 А то, что ловишь любой Исключение, а не только те, которые связаны с этими конкретными операциями, означает, что все виды ошибок останутся незамеченными.
  • По крайней мере, исключения следует где-то регистрировать
  • будьте более конкретны и вместо этого перехватывайте соответствующие исключения, обычно это будут такие вещи, как HTMLParser.HTMLParseError, а также requests.exceptions — немного поэкспериментируйте
  • Обратите внимание на разницу в поведении между find и find_all, поскольку вы используете обе функции:

Если find_all () ничего не может найти, он возвращает пустой список. Если find () ничего не может найти, он возвращает None

  • Вооружившись этими знаниями, вы можете просто проверить свои выражения на None, прежде чем пытаться получить значение с помощью find — лучше избегать исключения, чем обрабатывать его.
  • Аналогично, если bs4.find_all('a', {'class': 'question-hyperlink'}) возвращает пустой список, вы не продолжаете понимание списка, а присваиваете какое-то значение по умолчанию, возможно: payload['hyperlinks'] = None

Итак, ключевым моментом здесь является проверка результата каждого вызова find или же find_all и действовать соответственно. Тогда вы можете избавиться от этих блоков try catch. Достаточно только одного универсального обработчика исключений для всей процедуры.

  • Большое спасибо! Я абсолютно согласен. Есть несколько мест, где я могу использовать find без каких-либо попыток / ожиданий, потому что, если он не найдет, в любом случае он будет None! Но я хочу иметь своего рода функцию if else, где, если ее None, мы могли бы иметь значение по умолчанию, такое как getattr, но это также должно работать с одним лайнером, если оператор else тоже

    — Транспортир


  • 1

    Пожалуйста. Я советую провести стресс-тестирование вашей программы и сделать ее более устойчивой — протестировать ее в неблагоприятных условиях. Попробуйте проанализировать совершенно несвязанную страницу и посмотреть, как она отреагирует. Отсутствие на странице ожидаемых элементов не должно приводить к сбою приложения, обработчик исключений должен срабатывать, когда возникают другие типы проблем. Также попробуйте получить страницы с недоступных сайтов (например, с ошибками в адресе), чтобы проверить поведение. Хорошая программа должна аккуратно обрабатывать исключения.

    — анонимный

  • Очень хорошо сказано! Я сделаю это прямо сейчас! Я надеялся, что смогу использовать getattr, так как у него есть хорошая функция для проверки того, имеет ли webelement значение, и u может также иметь исключение по умолчанию, если оно не найдено, например, что мне понравилось, но не удалось заставить его работать с веб-сканированием

    — Транспортир

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *