объекты pandas, созданные с помощью bs4 и элементов регулярных выражений, печатаются в виде списков python

#python #regex #beautifulsoup

#python #регулярное выражение #beautifulsoup

Вопрос:

Я собираю данные о доме из zoopla.co.uk

Я получаю нужные данные, но три элемента печатаются в файл csv и фреймы данных в виде списков python. Два элемента bathrooms и bedrooms являются строками, поэтому они печатаются правильно, но остальные три элемента, которые были найдены с помощью regex, house_price , house_type и station_distance , печатаются как типы списков.

Должен ли я не использовать regex и использовать только bs4? Я не могу просто использовать функцию replace, верно? Заранее спасибо.

Код

 import requests
from bs4 import BeautifulSoup
import re
import pandas as pd

my_url = 'https://www.zoopla.co.uk/for-sale/property/b23/?page_size=100amp;q=B23amp;radius=0amp;results_sort=newest_listingsamp;search_source=refine'
res = requests.get(my_url)
soup = BeautifulSoup(res.text, "html.parser")
lis = soup.find("ul", class_="listing-results clearfix js-gtm-list").find_all("li", class_="srp clearfix")

for li in lis:
    bedrooms = li.find("span", class_="num-beds")
    bathrooms = li.find("span", class_="num-baths")

    price = li.find("a", class_="text-price")
    house_price = re.findall('£(d )', str(price))

    style = li.find("h2", class_="listing-results-attr")
    house_type = re.findall('(?<=bed ).*(?= for)', str(style))

    distance = li.find("li", class_="clearfix")
    station_distance = re.findall('d .?d*', str(distance))

    if bedrooms:
        bedrooms = bedrooms.get_text(strip=True)
    if bathrooms:
        bathrooms = bathrooms.get_text(strip=True)
    if house_price:
        house_price = house_price
    if house_type:
        house_type = house_type
    if station_distance:
        station_distance = station_distance

    df = pd.DataFrame({'house_price': house_price, 'house_type': house_type, 'station_distance': station_distance, 'bedrooms': bedrooms, 'bathrooms': bathrooms})
    print(df)

    df.to_csv('zoopla.csv')
  

Вывод

 house_price house_type  station_distance    bedrooms    bathrooms
0   [90]    [flat]  [0.2]   1   1
1   [210]   [detached house]    [0.6]   3   None
2   [160]   [end terrace house] [0.7]   2   1
3   [325]   [detached house]    [1.2]   4   1
4   [195]   [semi-detached house]   [1.1]   3   1
  

введите описание изображения здесь

Ответ №1:

Они печатаются как list, потому что вы используете findall,

 house_price = re.findall('£(d )', str(price))
house_type = re.findall('(?<=bed ).*(?= for)', str(style))
station_distance = re.findall('d .?d*', str(distance))
  

Вы можете сохранить первый элемент (внутри каждого if)

 house_price = house_price[0]
house_type = house_type[0]
station_distance = station_distance[0]
  

или попробуйте с помощью find (как вы делали с ванными и спальнями).

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

1. Подписка работает отлично. Спасибо. Я думал, что текст из этих 3 переменных house_price , house_type station_distance требует регулярного выражения для поиска текста. Можно ли их найти без регулярного выражения??? Не могли бы вы, пожалуйста, добавить пример использования find() функции, как вы предлагали? Спасибо!!