Парсинг на Python. Вывести пустые ячейки, если отсутствует тег или класс
Цель - спарсить каталог компаний. Есть проблема: Не во всех карточках компаний есть теги и классы, в которых указаны почта и урл. В таком случае, карточку этой компании парсер пропускает целиком. Нужно, чтоб компания попадала в список в любом случае, а вместо недостающих данных была просто пустая ячейка или что-то типа "No data". Вот такой есть код:
def get_content(html):
soup = BeautifulSoup(html, 'lxml')
items = soup.find_all(class_="row p-3 p-md-4")
company = []
for item in items:
try:
links = item.find("span", class_="cart-company-lg__list-link text-body font-weight-400").find('a').get('href')
except AttributeError:
print('empty')
continue
try:
mail = item.find("a", attrs={"target": "_blank"}).get_text()
except AttributeError:
print('empty')
continue
company.append(
{
"title":item.find(class_="cart-company-lg__title ui-title-inner").get_text(),
"link":item.find("span", class_="cart-company-lg__list-link text-body font-weight-400").find('a').get('href'),
"adres":item.find(class_="cart-company-lg__list-link").get_text(),
"phone":item.find("a", class_="text-nowrap").attrs['href'],
"mail":item.find("a", attrs={"target": "_blank"}).get_text(),
}
)
return company
def save_data(items, path):
with open(path, "w", newline="") as file:
writer = csv.writer(file, delimiter=";")
writer.writerow(["Name", "Link", "Adres", "Phone", "Mail"])
for item in items:
writer.writerow([item["title"], item["link"], item["adres"], item["phone"], item["mail"]])
def parser():
PAGINATION = input("Кол-во страниц: ")
PAGINATION = int(PAGINATION.strip())
html = get_html(URL)
if html.status_code == 200:
companys = []
for start_page in range(1, PAGINATION+1):
print(f"Pasce page: {start_page}")
html = get_html(URL, params={"start_page": start_page})
companys.extend(get_content(html.text))
save_data(companys, CSV)
pass
else:
print("Error")
parser()
Ответы (1 шт):
Автор решения: Сергей Ш
→ Ссылка
for item in items:
try:
links = item.find("span", class_="cart-company-lg__list-link text-body font-weight-400").find('a').get('href')
except AttributeError:
links = 'No data'
try:
mail = item.find("a", attrs={"target": "_blank"}).get_text()
except AttributeError:
mail = 'No data'
company.append(
{
"title":item.find(class_="cart-company-lg__title ui-title-inner").get_text(),
"link": links,
"adres":item.find(class_="cart-company-lg__list-link").get_text(),
"phone":item.find("a", class_="text-nowrap").attrs['href'],
"mail":mail,
}
)
return company