Как использовать красивый суп для извлечения элементов из складной секции - PullRequest
0 голосов
/ 18 апреля 2019

Я разрабатываю скребок для Python с использованием красивого soup4, и у меня возникают трудности с обработкой информации в свертываемом разделе на этой странице: https://www.redfin.com/CA/Los-Angeles/1366-W-22nd-St-90007/home/6896268.

Разборный раздел, который я хочу очистить, - «История собственности для 1366 West 22nd St». Я пытаюсь получить информацию о столбце «дата» и «цена».

url = "https://www.redfin.com/CA/Los-Angeles/1366-W-22nd-St-90007/home/6896268"

headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'}
req = urllib.request.Request(url, headers = headers)
res = urllib.request.urlopen(req, context=ssl.SSLContext())
soup = BeautifulSoup(res, 'html.parser')

dates = [td.text for td in soup.find_all('td', {"class": "date-col nowrap"})]

Однако даты, которые я извлек из столбца дат, имеют только 29 октября 2018 года, 24 августа 2018 года и 24 августа 2018 года, поскольку soup.find_all('td', {"class": "date-col nowrap"}) не может найти даты отдыха после этих трех дат. Даты отдыха свернуты и нужно нажать кнопку «Просмотреть всю историю собственности», чтобы развернуть даты отдыха. Есть ли способ очистить свернутые даты с помощью Selenium?

1 Ответ

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

Вот код, который должен работать, он возвращает таблицу в виде словаря кортежей.

import selenium
from selenium import webdriver
import time

url = "https://www.redfin.com/CA/Los-Angeles/1366-W-22nd-St-90007/home/6896268"

def browser():
    driver = webdriver.Chrome()
    driver.get(url)
    return driver

def main():
    driver = browser()
    el = driver.find_element_by_xpath('//span[contains(text(), "See all property history")]')
    el.click()
    # should expand quite quickly, otherwise might need to wait, e.g. time.sleep(5)
    row_arg = "//tr[@class=' PropertyHistoryEventRow']" # take note of the space before 'Property'
    rows = driver.find_elements_by_xpath(row_arg)
    tbl = {}
    for i, row in enumerate(rows):
        date = row.find_element_by_xpath('.//td[@class="date-col nowrap"]').text
        event = row.find_element_by_xpath('.//td[@class="event-col"]').text
        price = row.find_element_by_xpath('//td[@class="price-col number"]').text
        appre = row.find_element_by_xpath('.//td[@class="appreciation-col number empty"]').text
        tbl[i] = (date, event, price, appre)
    for k, v in tbl.items():
        print(k, v)

    return tbl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...