Как мне обрабатывать исключения в Python - PullRequest
0 голосов
/ 11 ноября 2019

Это ответило на мой вопрос, проблема решена. Вы можете удалить это сообщение.

RETRIES = 10

id = None
session = requests.Session()

for attempt in range(1, RETRIES + 1):
    response = session.get(url)
    soup = BeautifulSoup(r.text, "lxml")

    element = soup.find('a', class_="class", id=True)
    if element is None:
        print("Attempt {attempt}. Element not found".format(attempt=attempt))
        continue
    else:
        id = element["id"]
        break

print(id)

Ответ на мой вопрос, проблема решена. Вы можете удалить это сообщение.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Вы можете применить принцип «посмотри перед прыжком» (LBYL) и проверить результат find() - он вернет None, если элемент не найден. Затем вы можете поместить вещь в цикл и выйти, когда у вас есть значение, также защитив себя пределом счетчика цикла:

RETRIES = 10

id = None
session = requests.Session()

for attempt in range(1, RETRIES + 1):
    response = session.get(url)
    soup = BeautifulSoup(r.text, "lxml")

    element = soup.find('a', class_="class", id=True)
    if element is None:
        print("Attempt {attempt}. Element not found".format(attempt=attempt))
        continue
    else:
        id = element["id"]
        break

print(id)

Пара замечаний:

  • id=Trueбыл настроен на поиск только элементов с присутствующим элементом id. Вы также можете сделать эквивалент с помощью CSS-селектора soup.select_one("a.class[id]")
  • Session(), помогающего повысить производительность при многократной выдаче запросов на один и тот же хост. Подробнее на Сессионные объекты
0 голосов
/ 11 ноября 2019

Если все, что вы хотите сделать, это сделать тот же запрос во второй раз, вы можете сделать что-то вроде этого:

import requests
from bs4 import BeautifulSoup

def find_data(url):
    found_data = False
    while not found_data:
        r = requests.get(url)
        soup = BeautifulSoup(r.text, "lxml")
        try:
            id = soup.find('a', class_="class").get('id')
            found_data = True
        except:
            pass

Это подвергает вас риску бесконечного цикла, если данные на самом деле нетам. Вы можете сделать это, чтобы избежать этого бесконечного цикла:

import requests
from bs4 import BeautifulSoup

def find_data(url, attempts_before_fail=3):
    found_data = False
    while not found_data:
        r = requests.get(url)
        soup = BeautifulSoup(r.text, "lxml")
        try:
            id = soup.find('a', class_="class").get('id')
            found_data = True
        except:
            attempts_before_fail -= 1
            if attempts_before_fail == 0:
                raise ValueError("couldn't find data after all.")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...