Я пытался улучшить свои познания в 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 ответ
Короче говоря:
- в программировании нет ничего хуже молчаливого проглатывания исключений 🙂 А то, что ловишь любой Исключение, а не только те, которые связаны с этими конкретными операциями, означает, что все виды ошибок останутся незамеченными.
- По крайней мере, исключения следует где-то регистрировать
- будьте более конкретны и вместо этого перехватывайте соответствующие исключения, обычно это будут такие вещи, как 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 тоже— Транспортир
Пожалуйста. Я советую провести стресс-тестирование вашей программы и сделать ее более устойчивой — протестировать ее в неблагоприятных условиях. Попробуйте проанализировать совершенно несвязанную страницу и посмотреть, как она отреагирует. Отсутствие на странице ожидаемых элементов не должно приводить к сбою приложения, обработчик исключений должен срабатывать, когда возникают другие типы проблем. Также попробуйте получить страницы с недоступных сайтов (например, с ошибками в адресе), чтобы проверить поведение. Хорошая программа должна аккуратно обрабатывать исключения.
— анонимный
Очень хорошо сказано! Я сделаю это прямо сейчас! Я надеялся, что смогу использовать getattr, так как у него есть хорошая функция для проверки того, имеет ли webelement значение, и u может также иметь исключение по умолчанию, если оно не найдено, например, что мне понравилось, но не удалось заставить его работать с веб-сканированием
— Транспортир