带有提交按钮的Python Selenium问题,无法正常工作

时间:2019-06-19 20:34:36

标签: python selenium xpath css-selectors webdriverwait

我正在尝试为Redfin构建网络抓取工具以提取Redfin估算值。我有一个函数可以执行此操作,有时它可以工作,有时不起作用。我注意到它不起作用的原因是由于Submit函数。有时,Chrome页面不会按搜索(提交)按钮,而是转到属性页。

我不确定如何解决此问题并使之更加一致。

这是我的代码:

from selenium import webdriver
from selenium.webdriver.remote import webelement
import pandas as pd
import time
from bs4 import BeautifulSoup

driver = webdriver.Chrome('chromedriver.exe')
driver.get('https://www.redfin.com/')
time.sleep(3)

def get_redfin_estimate(address):
    search_box = driver.find_element_by_name('searchInputBox')
    search_box.send_keys(address)
    search_box.submit()
    time.sleep(3)
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    try:
        price1 = soup.find('div', {'class', 'avm'}).div.text
        return(price1)
    except AttributeError:
        try:
            time.sleep(10)
            price2 = soup.find('span',class_='avmLabel').find_next('span', class_='value').text
            return(price2)
        except:
            return('N/A')


print(get_redfin_estimate('687 Catalina Laguna Beach, CA 92651'))
print(get_redfin_estimate('693 Bluebird Canyon Drive, Laguna Beach, CA 92651'))



driver.quit()

2 个答案:

答案 0 :(得分:0)

提交按钮无法正常工作的原因是,所需元素是启用了JavaScript的元素,并且您使用的定位器策略无法识别搜索框,其中占位符城市,地址,学校,特工,邮政编码,并标识了三个元素。

要将字符序列发送到所需字段,您必须为element_to_be_clickable()引入 WebDriverWait ,并且可以使用以下任何{{3} }:

  • 使用CSS_SELECTOR

    def get_redfin_estimate(address):
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.searchInputNode input.search-input-box#search-box-input"))).send_keys(address)
        driver.find_element_by_css_selector("div.searchInputNode button.inline-block.SearchButton.clickable").click()
    
  • 使用XPATH

    def get_redfin_estimate(address):
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='searchInputNode']//input[@class='search-input-box' and @id='search-box-input']"))).send_keys(address)
        driver.find_element_by_xpath("//div[@class='searchInputNode']//button[@class='inline-block SearchButton clickable float-right']").click()
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

答案 1 :(得分:0)

在该元素上使用.submit()可能是一个问题。一种选择是只需单击放大镜即可开始搜索。

def get_redfin_estimate(address):
    driver.find_element_by_name('searchInputBox').send_keys(address)
    driver.find_element_by_css_selector("button[title='Search']").click()
    time.sleep(3)
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    ... and so on