繁体   English   中英

使用 beautifulsoup 从网站上抓取数据 - 嵌套

[英]Using beautifulsoup to scrape data from a website - nested

我正在使用 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',

我应该只得到粗体文本。

此文本当前嵌套在 a with a children 和另一个 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))

输出:

['Земеделски имот', 

'Земеделскиимот', 'Офис', 'Парцел', 'Търговскиобект', 'Гараж', 'Къща', 'Парцел', 'Магазин', 'Парцел', 'Двустаенапартамент', 'Къща', 'Къща' , 'Къща', 'Заведение', 'Къща', 'Едностаенапартамент', 'Къща', 'Земеделскиимот', 'Двустаенапартамент', 'Двустаенапартамент', 'Двустаенапартамент', 'Двустаенапартамент',“Двустаенапартамент ', 'Двустаен апартамент', 'Парцел', 'Двустаен апа

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM