Как избежать 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®ion_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 шт):
Как вариант использовать конструкцию try-except для того, чтоб отловить AttributeError.
try:
print(object.error_will_inevitably_happen)
except AttributeError:
print("It won't ;)")
Также можете получить список атрибутов объекта, вот таким способом:
dir(object)