Избегая попыток / за исключением случаев, когда веб-очистка html

#python #html #beautifulsoup

#python #HTML #beautifulsoup

Вопрос:

Недавно я писал веб-скребок, и я обнаружил, что вкладываю циклы try / except и полагаюсь на ошибки, чтобы управлять частью моего кода, как в следующих двух сегментах:

 try:
    reg_title = soup.find('p', {'class': "regnumber-e"}).text
except AttributeError:
    try:
        reg_title = soup.find('p', {'class': "regtitle-e"}).text
    except AttributeError:
        reg_title = soup.find('p', {'class': "Yregnumber-e"}).text
  

и

 if soup.find_all('p', {'class': "Notice"}):
    try:
        #More code
    except IndexError:
        #More code
        continue
elif (soup.find_all('p', {'class': "ConsolidationPeriod-e"}) or
      soup.find_all('p', {'class': "ConsolidationPeriod"})):
    try:
        text = soup.find('p', {'class': "ConsolidationPeriod-e"}).text
    except AttributeError:
        text = soup.find('p', {'class': "ConsolidationPeriod"}).text
elif soup.find('p', {'class': "Notice-e"}):
    #More code
    continue
else:
    continue
  

Очевидно, что я вырезал разделы кода, но конкретный код здесь не имеет значения. Как правило, мои плохие датчики кодирования отключаются, и я чувствую, что должен быть лучший способ навигации по различным html-тегам при просмотре веб-страниц. Есть какие-нибудь мысли?

Ответ №1:

Не могли бы вы просто try except всем своим кодом перехватывать несколько исключений? Нравится:

 try:
    # All your code
    # For exemple 
    # if soup.find_all('p', {'class': "Notice"}):
    #      ...
    # else:
    #      ...
except (AttributeError, IndexError) as e:
    continue
  

И для части, где вы пытаетесь получить текст, простого теста, на мой взгляд, может быть достаточно

Нравится:

 if soup.find('p', {'class': "ConsolidationPeriod-e"}):
    text = soup.find('p', {'class': "ConsolidationPeriod-e"}).get_text()
else:
    text = soup.find('p', {'class': "ConsolidationPeriod"}).text
  

Или:

 if soup.find('p', {'class': "regnumber-e"}):
    reg_title = soup.find('p', {'class': "regnumber-e"}).get_text()
elif soup.find('p', {'class': "regtitle-e"}):
    reg_title = soup.find('p', {'class': "regtitle-e"}).get_text()
else:
    reg_title = soup.find('p', {'class': "Yregnumber-e"}).get_text()