Python Selenium提交按钮有问题,工作不一致

2024-06-02 08:38:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图建立一个网站刮板为红鳍拉红鳍估计。我有一个函数可以做到这一点,有时它工作,有时它不工作。我注意到它不起作用的原因是submit函数。有时chrome页面不会按search(提交)按钮并转到属性页。你知道吗

我不知道如何解决这个问题,使它更加一致。你知道吗

这是我的密码:

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()

Tags: fromimportboxsearchgetreturntimedriver
2条回答

原因提交按钮工作不一致,因为所需的元素是启用了JavaScript的元素,并且您使用的定位器策略没有将带有占位符搜索框唯一地标识为城市、地址、学校、代理、邮政编码并标识3个元素。你知道吗

要将字符序列发送到所需字段,必须为element_to_be_clickable()导入WebDriverWait,并且可以使用以下Locator Strategies之一:

  • 使用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
    

在该元素上使用.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

相关问题 更多 >