我正在尝试为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()
答案 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