Сложность использования Beautifulsoup в Python для очистки веб-данных от нескольких классов HTML - PullRequest
1 голос
/ 05 июня 2019

Я использую Beautiful Soup в Python для очистки некоторых данных с сайта объявлений о недвижимости.

Мне удалось очистить отдельные элементы, которые мне нужны, но я хочу использовать более эффективный сценарий для извлечения всех данных одной командой, если это возможно. Сложность в том, что различные элементы, которые мне нужны, находятся в разных классах.

Пока я пробовал следующее.

for listing in content.findAll('h2', attrs={"class": "listing-results-attr"}):
    print(listing.text)

, который успешно выдает следующий список

15 room mansion for sale
3 bed barn conversion for sale
2 room duplex for sale
1 bed garden shed for sale

Отдельно для получения информации об адресе для каждого списка я успешно использовал следующее:

for address in content.findAll('a', attrs={"class": "listing-results-address"}):
    print(address.text)

, который дает это

22 Acacia Avenue, CityName Postcode
100 Sleepy Hollow, CityName Postcode
742 Evergreen Terrace, CityName Postcode
31 Spooner Street, CityName Postcode

А для цены на недвижимость я использовал это ...

for prop_price in content.findAll('a', attrs={"class": "listing-results-price"}):
    print(prop_price.text)

который дает ...

$350,000
$1,250,000
$750,000
$100,000

Это замечательно, однако мне нужно иметь возможность извлекать всю эту информацию более эффективным и производительным способом, чтобы все данные возвращались за один проход.

В настоящее время я могу сделать это, используя что-то вроде кода ниже:

all = content.select("a.listing-results-attr, h2.listing-results-address, a.listing-results-price")

Это работает несколько, но возвращает слишком много дополнительных HTML-тэгов и просто не так элегантно или изощренно, как мне требуется. Результаты следующие.

</a>, <h2 class="listing-results-attr">
<a href="redacted" style="text-decoration:underline;">15 room mansion for sale</a>
</h2>, <a class="listing-results-address" href="redacted">22 Acacia Avenue, CityName Postcode</a>, <a class="listing-results-price" href="redacted">

$350,000

Ожидаемые результаты должны выглядеть примерно так:

15 room mansion for sale
22 Acacia Avenue, CityName Postcode
$350,000

3 bed barn conversion for sale
100 Sleepy Hollow, CityName Postcode
$1,250,000

etc 
etc

Затем мне нужно сохранить результаты в виде объектов JSON для последующего анализа.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

find_all() функция всегда возвращает список, strip() - удаление пробелов в начале и в конце строки.

import requests
from bs4 import BeautifulSoup as bs

url = 'https://www.zoopla.co.uk/for-sale/property/caerphilly/?q=Caerphilly&results_sort=newest_listings&search_source=home'
r = requests.get(url)
soup = bs(r.content, 'lxml')

results = soup.find("ul",{'class':"listing-results clearfix js-gtm-list"})

for li in results.find_all("li",{'class':"srp clearfix"}):
    price = li.find("a",{"class":"listing-results-price text-price"}).text.strip()
    address = li.find("a",{'class':"listing-results-address"}).text.strip()
    description = li.find("h2",{'class':"listing-results-attr"}).find('a').text.strip()

    print(description)
    print(address)
    print(price)

O / P:

2 bed detached bungalow for sale
Bronrhiw Fach, Caerphilly CF83
£159,950
2 bed semi-detached house for sale
Cwrt Nant Y Felin, Caerphilly CF83
£159,950
3 bed semi-detached house for sale
Pen-Y-Bryn, Caerphilly CF83
£102,950
.....
0 голосов
/ 05 июня 2019

Измените ваши селекторы, как показано ниже:

import requests
from bs4 import BeautifulSoup as bs

url = 'https://www.zoopla.co.uk/for-sale/property/caerphilly/?q=Caerphilly&results_sort=newest_listings&search_source=home'
r = requests.get(url)
soup = bs(r.content, 'lxml')
details = ([item.text.strip() for item in soup.select(".listing-results-attr a, .listing-results-address , .text-price")])

Вы можете просмотреть отдельно, например,

prices = details[0::3]
descriptions = details[1::3]
addresses = details[2::3]
print(prices, descriptions, addresses)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...