Как избежать AttributeError?

Изучаю питона, решил написать парсер для работы и столкнулся с непониманием как реализовать парсинг если при отсутствии определенных данных меняется разметка страницы. Более точный пример: Тут в таблице меня интересуют "права и ограничения", если они есть - всё отлично работает, но если графа пустая - выдает AttributeError. Буду благодарен если подскажите как быть в такой ситуации.

Для удобства можно заменить переменную "i" на 53:11:1400111:243, а потом на 53:11:1400111:244. Заранее спасибо! PS Хотел бы ещё "получить тапком" за код, что в нём можно было бы исправить

import csv
import os
import requests
from bs4 import BeautifulSoup
from openpyxl import load_workbook

#Импорт книги
wb = load_workbook('./Книга1.xlsx')
ws = wb.worksheets[0]

# Добавление данных из книги в список
sheet = wb.active
cad_number = []
for cell in sheet['A'][1:]:
    cad_number.append(cell.value)
    # print(cell.value)
print(cad_number)

URL = []
for i in cad_number:
    URL.append("https://rosreestr.gov.ru/wps/portal/p/cc_ib_portal_services/online_request/" \
      "!ut/p/z1/pZBPc4IwEMU_Sw89JwGs1VuqDu3Yav3XCpdMiBmNA4EJoZ1--24Co72ohzLMkGV_b9_boBRtUar5l9pzq0rNc6iT9IHFi2hCRhGZxgvSx_" \
      "SFTklIYozXPfR5FZgTlP5HD4DT4wsPxaBPr1qMghuAi3jLJIGQfYbJMyU0Cqbz8XqA6TLEH6-zIMCYoJWbIUptTZnn0qDkHq8kN-" \
      "JAhbtI1z2UTS1hEhzLfMd0U2QOdHVtjZT2dG6EbUyH8oobW0jddQX3SpT0wiEhQxKBOXyDcHCew-xPBWoocPsTJrCqrJVPkvQ8atT-" \
      "YJmR-861yY5SdCZZo_Kd0l0LGK_zmLQ2l-c4td-R8XbJBKJLv192bFP-YdpQIzpms83b02TpWlILuAXDtZBdlKrYbLF6L4rH8ML7ffcLkvVyDA!!" \
      "/p0/IZ7_01HA1A42KODT90AR30VLN22001=CZ6_GQ4E1C41KGQ170AIAK131G00T5=MEcontroller!QCPObjectDataController==" \
      "/?object_data_id=" + i + "&dbName=firLite&region_key=153")
print(*URL, sep='\n')


HEADERS = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 OPR/78.0.4093.147",
    "accept": "*/*"
}
FILE = 'cad.csv'

def get_html(url, params=None):
    r = requests.get(url, headers=HEADERS, params=params)
    return r


def get_content(html):
    soup = BeautifulSoup(html, 'html.parser')
    items = soup.find_all(class_='portlet-body')
    prav = soup.find(class_='tdcap1').find_next('td').find_next('td').get_text()
    for string in prav:
        while '' in prav:
            prav = prav.split()
    new_pravo = ' '.join(prav)
    #print(new_pravo)
    #print(prav)

    end_numbers = []
    for item in items:
        end_numbers.append({
            'Кадастровый номер': item.find(class_='brdw1010').find('b').text,
            'Инвентарный номер': item.find('td', class_='brdw1010').find_next('td', class_='brdw1010').find('table').find('td').find_next('td').find('b').get_text(strip=True),
            'Право': new_pravo,
            'Ограничение': item.find(class_='tdcap').find_next('td').find_next('td').get_text(strip=True)
        })
    print(end_numbers)
    return end_numbers

def save_file(items, path):
    with open(path, 'a', newline='') as file: #, encoding='utf-8'
        writer = csv.writer(file, delimiter=';')
        #writer.writerow(['Кадастровый номер', 'Инвентарный номер', 'Право', 'Ограничение'])
        for item in items:
            writer.writerow([item['Кадастровый номер'],item['Инвентарный номер'],item['Право'],item['Ограничение']])


def parse():
    for site in URL:
        html = get_html(site)
        if html.status_code == 200:
            cad_number=[]
            #for site in URL:
            html = get_html(site)
            cad_number.extend(get_content(html.text))
            #get_content(html.text)
            save_file(cad_number, FILE)
        else:
            print("атата")


parse()

Ответы (1 шт):

Автор решения: Victor VosMottor

Как вариант использовать конструкцию try-except для того, чтоб отловить AttributeError.

try:
    print(object.error_will_inevitably_happen)
except AttributeError:
    print("It won't ;)")

Также можете получить список атрибутов объекта, вот таким способом:

dir(object)
→ Ссылка