detail_title
не содержит того, что вы можете поместить в фрейм данных: это список объектов BeautifulSoup "bs4.element.Tag" (посмотрите, что вам даст type(detail_title[0])
). Попробуйте следующее:
Шаг 1. Извлеките заголовки столбцов
import pandas as pd
import requests
from bs4 import BeautifulSoup
url = 'https://www.remax.ca/ab/calgary-real-estate/720-37-st-nw-wp_id251536557-lst'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
detail_title = soup.find_all(class_='detail-title')
headings = [d.text for d in detail_title]
details_t = pd.DataFrame(columns = headings)
Шаг 2. Перейдите на один уровень вверх в html и получите пары подробных имен и значений. (Имена деталей - это то, что вы уже извлекли на шаге 1). Напишите вспомогательную функцию, которая будет возвращать значение с указанным именем.
details = soup.find_all(class_='detail-row ng-star-inserted')
def get_detail_value(detail_title, details):
return [(d.find(class_='detail-value')).text for d in details if (d.find(class_='detail-title')).text == detail_title]
Это немного странно, если вы просматриваете только 1 страницу. Я думаю, что вам нужно будет выполнить шаг 1 один раз, чтобы получить подробные имена, затем шаг 2 для всех страниц, которые вы хотите очистить.
Шаг 3. Для каждой страницы, которую вы очищаете, добавьте найденные значенияподробности к фрейму данных.
details_t = details_t.append({deet:get_detail_value(deet, details) for deet in details_t.columns}, ignore_index = True)