Попытка очистить определенную часть HTML с помощью Python-3.7, но он возвращает «Нет» - PullRequest
3 голосов
/ 11 апреля 2019

Я новичок в написании простого кода на Python для очистки данных с веб-страницы. Я нашел именно ту часть HTML, которую я хочу очистить, но она продолжает возвращать «Нет». Это работает для других частей веб-страницы, но не для этой конкретной части

Я использую BeautifulSoup для анализа html, и, поскольку я могу почистить часть кода, я предполагаю, что мне не нужно будет использовать Selenium. Но я все еще не могу найти, как очистить одну конкретную часть.

Вот код Python, который я написал:

import requests

from bs4 import BeautifulSoup


url = 'https://www.rent.com/new-york/tuckahoe-apartments?page=2'

response = requests.get(url)

html_soup = BeautifulSoup(response.text, 'html.parser')

apt_listings = html_soup.find_all('div', class_='_3RRl_')
print(type(apt_listings))
print(len(apt_listings))

first_apt = apt_listings[0]

first_apt.a

first_add = first_apt.a.text

print(first_add)


apt_rents = html_soup.find_all('div', class_='_3e12V')
print(type(apt_rents))
print(len(apt_rents))

first_rent = apt_rents[0]

print(first_rent)

first_rent = first_rent.find('class', attrs={'data-tid' : 'price'})

print(first_rent)

Вот вывод из CMD:

<class 'bs4.element.ResultSet'>
30
address not disclosed
<class 'bs4.element.ResultSet'>
30
<div class="_3e12V" data-tid="price">$2,350</div>
None

«Адрес не разглашается» является правильным и был успешно удален. Я хочу потратить $ 2,350, но он продолжает возвращать «Нет». Я думаю, что я близок к тому, чтобы сделать это правильно, но я просто не могу получить $ 2,350. Любая помощь с благодарностью.

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Вы можете извлечь все списки из тега скрипта и проанализировать как json.Регулярное выражение ищет этот тег сценария, который начинается window.__APPLICATION_CONTEXT__ =.

enter image description here

Строка после этого извлекается через группу в регулярном выражении (.*).Этот объект javascript может быть проанализирован как json, если строка загружена с помощью json.loads.

Вы можете исследовать объект json здесь

import requests
import json
from bs4 import BeautifulSoup as bs
import re
base_url = 'https://www.rent.com/'
res = requests.get('https://www.rent.com/new-york/tuckahoe-apartments?page=2')
soup = bs(res.content, 'lxml')
r = re.compile(r'window.__APPLICATION_CONTEXT__ = (.*)')
data = soup.find('script', text=r).text
script = r.findall(data)[0]
items = json.loads(script)['store']['listings']['listings']
results = []

for item in items:   
    address = item['address']
    area = ', '.join([item['city'], item['state'], item['zipCode']])
    low_price = item['aggregates']['prices']['low']
    high_price = item['aggregates']['prices']['high']
    listingId = item['listingId']
    url = base_url + item['listingSeoPath']
    # all_info = item
    record = {'address' : address,
              'area' : area,
              'low_price' : low_price,
              'high_price' : high_price,
              'listingId' : listingId,
              'url' : url}
    results.append(record)
df = pd.DataFrame(results, columns = [ 'address', 'area', 'low_price', 'high_price', 'listingId', 'url'])
print(df)

Примеррезультатов:

enter image description here


Короткая версия с классом:

import requests
from bs4 import BeautifulSoup
url = 'https://www.rent.com/new-york/tuckahoe-apartments?page=2'
response = requests.get(url)

soup = BeautifulSoup(response.text, 'html.parser')
print(soup.select_one('._3e12V').text)

Все цены:

import requests
from bs4 import BeautifulSoup
url = 'https://www.rent.com/new-york/tuckahoe-apartments?page=2'
response = requests.get(url)

html_soup = BeautifulSoup(response.text, 'html.parser')
print([item.text for item in html_soup.select('._3e12V')])
0 голосов
/ 11 апреля 2019

вам нужно использовать свойство .text BeautifulSoup вместо .find (), например:

first_rent = first_rent.text

так просто.

...