python - 使用 beautifulsoup 从网站抓取数据 - 嵌套
问题描述
我正在使用 beautifulsoup 从房地产网站上抓取数据。
这是该页面的链接: https ://www.imoti.net/bg/obiavi/r/prodava/bulgaria/?page=1&sid=iXMpXe
我有以下运行良好的代码。
from requests_html import HTMLSession
from bs4 import BeautifulSoup
import pandas as pd
import re
s = HTMLSession()
url = 'https://www.imoti.net/bg/obiavi/r/prodava/bulgaria/?page=1&sid=iXMpXe'
r = s.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
def get_prices(urls):
prices = []
type_of_property = []
for price in soup.find('ul', {'class': 'list-view real-estates'}).find_all('strong', {'class': 'price'}):
price_text = price.get_text()
price_arr = re.findall('[0-9]+', price_text)
final_price = ''
for each_sub_price in price_arr:
final_price += each_sub_price
prices.append(final_price)
for property_type in soup.find('ul', {'class': 'list-view real-estates'}).find_all('div', {'class': 'inline-group'}):
property_type_value = property_type.get_text()
type_of_property.append(property_type_value)
return prices, type_of_property
print(get_prices(url))
我得到的输出是:
(['1000', '1341', '1381', '1400', '2659', '11990', '14000', '18900', '23000', '25000', '28500', '29923', '31714', '34034', '35000', '35806', '36615', '37900', '39386', '40523', '42000', '42174', '44000',
'44300', '44400', '45000', '45899', '46000', '47550', '47999'], ['\nпродава Земеделски имот, 2833 м2\nВелико Търново област, с.Въглевци\n', '\nпродава Земеделски имот, 7186 м2\nВелико Търново област, с.Въглевци\n', '\nпродава Офис, 36 м2\nПловдив област, гр.Първомай\n', '\nпродава Парцел, 543 м2\nСофия, Сердика\n', '\nпродава Търговски обект, 125 м2\nПловдив област, с.Караджалово\n', '\nпродава Гараж, паркомясто, 17 м2\nСофия, Център, бул. Т. Александров\n', '\nпродава Къща, 120 м2\nПазарджик област, с.Поибрене\n', '\nпродава Парцел, 728 м2\nСмолян, Устово\n', '\nпродава Магазин, 31 м2\nСофия, Люлин 9\n', '\nпродава Парцел, 382 м2\nСофия област, с.Мала Църква\n', '\nпродава Двустаен апартамент, 32 м2\nБургас, Сарафово\n', '\nпродава Къща, 124 м2\nСофия област, с.Осиковица\n', '\nпродава Къща, 64 м2\nСофия област, гр. Етрополе\n', '\nпродава Къща, 100 м2\nМонтана област, гр.Берковица\n', '\nпродава Заведение, 185 м2\nСофия, Младост 4\n', '\nпродава Къща, 184 м2\nПловдив област, с.Новаково\n', '\nпродава Едностаен апартамент, 52 м2\nПловдив, Христо Смирненски\n', '\nпродава Къща, 105 м2\nПловдив област, с.Брестник\n', '\nпродава Земеделски имот, 7000 м2\nБлагоевград област, гр.Банско\n', '\nпродава Двустаен апартамент, 59 м2\nПловдив, Кючук Париж\n', '\nпродава Двустаен апартамент, 75 м2\nПловдив, Южен\n', '\nпродава Двустаен апартамент, 60 м2\nПловдив, Христо Смирненски\n', '\nпродава Двустаен апартамент,
67 м2\nВарна, Трошево\n', '\nпродава Двустаен апартамент, 68 м2\nБургас област, гр.Черноморец\n', '\nпродава Двустаен апартамент, 95 м2\nБлагоевград област, гр.Банско\n', '\nпродава Парцел, 521 м2\nСофия, Требич\n', '\nпродава Двустаен апартамент, 65 м2\nПловдив, Христо Смирненски\n', '\nпродава Парцел, 635 м2\nСофия, Казичене (с.)\n', '\nпродава Земеделски имот, 6640 м2\nБургас област, гр.Каблешково\n',
'\nпродава Двустаен апартамент, 40 м2\nПловдив, Кършияка\n'])
第一个数组是正确的。我知道价格。
然而,在第二个中,我应该只得到属性的类型。
例如:从这个 ['\nпродава Земеделски имот , 2833 м2\nВелико Търново област, с.Въглевци\n',
我应该只得到粗体字。
此文本当前嵌套在一个 with a children with another children 中。实际上介于两者之间,这对我来说很奇怪。
有什么想法可以提取这些信息吗?
解决方案
您可以使用 split() 方法执行此操作,如下所示:
from requests_html import HTMLSession
from bs4 import BeautifulSoup
import pandas as pd
import re
s = HTMLSession()
url = 'https://www.imoti.net/bg/obiavi/r/prodava/bulgaria/?page=1&sid=iXMpXe'
r = s.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
def get_prices(urls):
prices = []
type_of_property = []
for price in soup.find('ul', {'class': 'list-view real-estates'}).find_all('strong', {'class': 'price'}):
price_text = price.get_text()
price_arr = re.findall('[0-9]+', price_text)
final_price = ''
for each_sub_price in price_arr:
final_price += each_sub_price
prices.append(final_price)
for property_type in soup.find('ul', {'class': 'list-view real-estates'}).find_all('div', {'class': 'inline-group'}):
property_type_value = ' '.join(property_type.get_text().split(',')[0].split()[1:3])
type_of_property.append(property_type_value)
return prices, type_of_property
print(get_prices(url))
输出:
['Земеделски имот',
'зLTEmTommETOmmETHOMTEMTEM。 , 'Къща', 'Заведение', 'Къща', 'Едностаен апартамент', 'Къща', 'Земеделски имот', 'Двустаен апартамент', 'Двустаен апартамент', 'Двустаен апартамент', 'Двустаен апартамент', 'Двустаен апартамент '、'Двустаен апартамент'、'Парцел'、'Двустаен апа
推荐阅读
- php - 下载通过 file_get_contents() php 打开的 pdf 文件时出现网络错误
- intellij-idea - 不能用 IntelliJ 和 OpenJDK 9 编译 AspectJ
- c# - XAMARIN - Mono.Android - 预验证类中的类引用解析为意外实现
- amazon-web-services - 我们可以通过cloudformation模板创建用户吗?
- javascript - Spring CSRF fetch (POST) 失败(客户端:react-native / Javascript)
- c# - UWP 无需打印预览即可打印
- javascript - 数组减少不适用于长度 1 在给定情况下我该如何处理?
- python - 替换 for 循环以从具有多个列表的数据框中过滤值
- google-api - 使用静态响应测试 android 应用内购买时获取“无效值”
- php - 从php调用API时未传递JSON参数