Проблема Python Selenium с кнопкой отправки, не работающей последовательно - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь построить веб-скребок для redfin, чтобы получить оценку redfin. У меня есть функция, которая делает это, и иногда это работает, а иногда это не работает. Я заметил, что причина, по которой это не работает, из-за функции отправки. Иногда страница 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 голосов
/ 20 июня 2019

Может быть проблема с использованием .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
0 голосов
/ 20 июня 2019

Причина, по которой кнопка submit работает некорректно, потому что желаемый элемент - это элемент с поддержкой JavaScript , а используемая вами стратегия Locator не определяет поле поиска с заполнителем как Город, адрес, школа, агент, ZIP уникально и определяет 3 элемента.

Чтобы отправить последовательность символов в нужное поле, вы должны вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать любую из следующих Стратегий локатора :

  • Использование 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
    
...