Проблема с извлечением цены из 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 для поиска соответствующих элементов, но не получаю ожидаемых результатов.

Могли бы вы помочь мне понять, в чем я ошибаюсь, и как я могу правильно извлечь информацию о цене с веб-страницы? Заранее спасибо за вашу помощь!


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