首页 > 解决方案 > 使用 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 中。实际上介于两者之间,这对我来说很奇怪。

有什么想法可以提取这些信息吗?

标签: pythonweb-scrapingbeautifulsoup

解决方案


您可以使用 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。 , 'Къща', 'Заведение', 'Къща', 'Едностаен апартамент', 'Къща', 'Земеделски имот', 'Двустаен апартамент', 'Двустаен апартамент', 'Двустаен апартамент', 'Двустаен апартамент', 'Двустаен апартамент '、'Двустаен апартамент'、'Парцел'、'Двустаен апа


推荐阅读