BeautifulSoup организует данные в таблицу фреймов данных

#python #pandas #dataframe #beautifulsoup

Вопрос:

Я работал с BeautifulSoup, чтобы попытаться упорядочить некоторые данные, которые я извлекаю с веб-сайта (html) Я смог свести данные к минимуму, но застрял на том, как это сделать:

  1. исключите ненужную информацию
  2. организуйте оставшиеся данные, которые будут помещены в фрейм данных pandas

Вот код, с которым я работаю:

 import urllib.request
from bs4 import BeautifulSoup as bs
import re
import pandas as pd
import requests

headers = requests.utils.default_headers()
headers.update({
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
})

url = 'https://www.apartments.com/lehi-ut/1-bedrooms/'

page = requests.get(url,headers = headers)

soup = bs(page.text)

names = soup.body.findAll('tr')
function_names = re.findall('th class="w ', str(names))
function_names = [item[10:] for item in function_names]

description = soup.body.findAll('td')
#description = re.findall('td class="w ', str(description))

data = pd.DataFrame({'Title':function_names,'Info':description})
 

Ошибка, которую я получаю, заключается в том, что номера массивов не совпадают, и я знаю, что это правда, но когда я отменяю хэштег во второй строке описания, он удаляет нужные мне числа оттуда, и даже тогда таблица не упорядочивается должным образом.

Я бы хотел, чтобы результат выглядел так:

 (headers)  title: location | studio | 1 BR | 2 BR | 3 BR
(new line) data :  Lehi, UT| $1,335 |$1,309|$1,454|$1,580    
 

Это действительно все, что мне нужно, но я не могу заставить BS или Панд сделать это должным образом.

Любая помощь будет очень признательна!

Комментарии:

1. Вы рассчитываете средние значения?

2. Нет, информация уже содержится в листе, так что никакой математики, просто пытающейся организовать

Ответ №1:

Попробуйте следующий подход. Сначала он извлекает все данные из таблицы, а затем перемещает их (столбцы меняются местами со строками).:

 import urllib.request
from bs4 import BeautifulSoup as bs
import re
import pandas as pd
import requests

headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}

url = 'https://www.apartments.com/lehi-ut/1-bedrooms/'
page = requests.get(url, headers=headers)
soup = bs(page.text, 'lxml')
table = soup.find("table", class_="rentTrendGrid")
rows = []

for tr in table.find_all('tr'):
    rows.append([td.text for td in tr.find_all(['th', 'td'])])

#header_row = rows[0]
rows = list(zip(*rows[1:])) # tranpose the table
df = pd.DataFrame(rows[1:], columns=rows[0])
print(df)
 

Предоставление вам следующего вида выходных данных:

    Studio    1 BR    2 BR    3 BR
0       0     729   1,041   1,333
1  $1,335  $1,247  $1,464  $1,738
 

Комментарии:

1. Классно! Спасибо за вашу помощь!