#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()
функции, как вы предлагали? Спасибо!!