Проблема с извлечением цены из HTML с помощью BeautifulSoup
Я работаю над проектом парсинга веб-сайта с использованием Python и BeautifulSoup для извлечения данных. У меня возникли проблемы с извлечением информации о цене из HTML.
import requests
from bs4 import BeautifulSoup
import time
import random
# Инициализация базы данных
def init_db(db_name):
conn = sqlite3.connect(db_name)
cursor = conn.cursor()
return conn, cursor
# Обновление статуса ссылки
def update_link_status(cursor, url, status):
cursor.execute('UPDATE ads SET checked = ? WHERE url = ?', (status, url))
cursor.connection.commit()
# Парсинг данных со страницы
def parse_data(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
response = requests.get(url, headers=headers)
if response.status_code != 200:
return None # Если запрос не успешен, возвращаем None
soup = BeautifulSoup(response.text, "html.parser")
data = {}
try:
data['title'] = soup.find(class_="a10a3f92e9--title--vlZwT").get_text(strip=True)
except AttributeError:
data['title'] = None
try:
price_element = soup.find("div", {"data-name": "PriceItem"})
if price_element:
price_text = price_element.get_text(strip=True)
if "₽/мес." in price_text:
data['price'] = price_text
else:
data['price'] = None
else:
data['price'] = None
except AttributeError:
data['price'] = None
try:
data['address'] = soup.find(attrs={"data-name": "AddressContainer"}).get_text(strip=True)
except AttributeError:
data['address'] = None
try:
data['description'] = soup.find(class_="a10a3f92e9--color_black_100--Ephi7 a10a3f92e9--lineHeight_6u--cedXD a10a3f92e9--fontWeight_normal--JEG_c a10a3f92e9--fontSize_16px--QNYmt a10a3f92e9--display_block--KYb25 a10a3f92e9--text--e4SBY a10a3f92e9--text_letterSpacing__0--cQxU5 a10a3f92e9--text_whiteSpace__pre-wrap--fXAax").get_text(strip=True)
except AttributeError:
data['description'] = None
# Извлечение всех адресов и поиск района
data['district'] = None
addresses = soup.find_all(class_="a10a3f92e9--address--SMU25")
for address in addresses:
address_text = address.get_text(strip=True)
if 'р-н' in address_text:
data['district'] = address_text.split('р-н')[-1].strip()
break
return data
# Сохранение данных в новую базу данных
def save_parsed_data(cursor, data):
cursor.execute('''
CREATE TABLE IF NOT EXISTS ads_data (
id INTEGER PRIMARY KEY,
title TEXT,
price TEXT,
address TEXT,
description TEXT,
district TEXT
)
''')
cursor.execute('''
INSERT INTO ads_data (title, price, address, description, district)
VALUES (?, ?, ?, ?, ?)
''', (data['title'], data['price'], data['address'], data['description'], data['district']))
cursor.connection.commit()
# Основная функция
def main():
source_db_name = 'cian_ads.db'
target_db_name = 'cian_parsed_data.db'
conn_source, cursor_source = init_db(source_db_name)
conn_target, cursor_target = init_db(target_db_name)
cursor_source.execute('SELECT url FROM ads WHERE checked = 0')
urls = cursor_source.fetchall()
try:
for url_tuple in urls:
url = url_tuple[0]
print(f"Parsing URL: {url}")
data = parse_data(url)
if data:
print(f"Parsed data: {data}")
save_parsed_data(cursor_target, data)
update_link_status(cursor_source, url, 1)
else:
print(f"Failed to parse data for URL: {url}")
update_link_status(cursor_source, url, -1) # Обновляем статус на -1, если не удалось получить данные
time_to_sleep = random.randint(1, 10) # рандомная пауза между 1 и 10 секунд
print(f"Sleeping for {time_to_sleep} seconds")
time.sleep(time_to_sleep)
finally:
conn_source.close()
conn_target.close()
if __name__ == "__main__":
main()
Я конкретно испытываю затруднения с извлечением цены из HTML. Я пытался использовать BeautifulSoup для поиска соответствующих элементов, но не получаю ожидаемых результатов.
Могли бы вы помочь мне понять, в чем я ошибаюсь, и как я могу правильно извлечь информацию о цене с веб-страницы? Заранее спасибо за вашу помощь!