如何使用漂亮的汤从可折叠部分中提取元素

时间:2019-04-18 07:48:01

标签: python web-scraping beautifulsoup

我正在使用漂亮的汤[4]开发python刮板,并且很难在此页面的可折叠部分中刮除信息:https://www.redfin.com/CA/Los-Angeles/1366-W-22nd-St-90007/home/6896268

我要抓取的可折叠部分是“西22街1366号的房地产历史”。我要获取的信息是“日期”列和“价格”列。

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"})]

但是,我从日期列中抓取的日期只有2018年10月29日,2018年8月24日和2018年8月24日,因为soup.find_all('td', {"class": "date-col nowrap"})无法找到这三个日期之后的其余日期。剩余日期已折叠,需要单击“查看所有财产历史记录”按钮以显示剩余日期。有什么方法可以使用Selenium刮除折叠的日期吗?

1 个答案:

答案 0 :(得分:0)

这是应该起作用的代码,它将表作为元组的字典返回。

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