selenium.common.exceptions.NoSuchElementException: Сообщение: {errorMessage: Невозможно найти элемент с идентификатором 'search-facet-city'

Я пытаюсь очистить следующий веб-сайт, используя Python 3, Selenium и PhantomJS:

https://health.usnews.com/best-hospitals/search

Мне нужно найти поле поиска и ввести в него текст, а затем нажать клавишу ввода, чтобы сгенерировать результаты поиска. Ниже приведен HTML-код, соответствующий полю поиска, которое я пытаюсь найти:

<div class="search-field-view">

<div class="block-tight">
    <label class="" for="search-facet-city">
        <input id="search-facet-city" autocomplete="off" name="city" 
type="text" data-field-type="text" placeholder="City, State or ZIP" 
value="" />
    </label>
</div>

</div>

Ниже приведен мой код Python 3, который пытается найти это поле поиска, используя идентификатор «search-facet-city».

def scrape(self):
    url = 'https://health.usnews.com/best-hospitals/search'
    location = 'Massachusetts'

    # Instantiate the driver
    driver = webdriver.PhantomJS()
    driver.get(url)
    driver.maximize_window()
    driver.implicitly_wait(10)

    elem = driver.find_element_by_id("search-facet-city")
    elem.send_keys(self.location)

    driver.close()

Мне нужно очистить некоторые результаты со страницы после ввода текста в поле поиска. Однако я продолжаю получать ошибку NoSuchElementException; он не может найти элемент окна поиска, несмотря на то, что он существует. Как я могу это исправить?


person rakeshb    schedule 27.10.2017    source источник
comment
Ошибка в заголовке вашего сообщения ищет search-facet-city как class, но ваш опубликованный код ищет его как id. Что он?   -  person John Gordon    schedule 27.10.2017
comment
Извините, это была опечатка. Это должно быть удостоверение личности.   -  person rakeshb    schedule 27.10.2017
comment
Когда я пытаюсь получить этот URL-адрес, я получаю ответ 403 Forbidden. Ты уверен, что умеешь читать?   -  person John Gordon    schedule 27.10.2017
comment
Да, я могу прочитать URL. Я могу извлечь некоторый текст из URL-адреса, но моя основная проблема заключается в том, чтобы найти окно поиска и ввести в него текст. Я не совсем уверен, что может быть причиной ответа 403 Forbidden. Вы включили весь необходимый импорт?   -  person rakeshb    schedule 27.10.2017
comment
Я получаю 403 от wget в командной строке. Веб-сайт, вероятно, запрещает клиентам-роботам. Я попробовал URL-адрес в Chrome, и страница загрузилась, однако мой Mac полностью завис, когда я пытался просмотреть исходный код, поэтому я не думаю, что снова буду посещать эту страницу.   -  person John Gordon    schedule 27.10.2017
comment
Единственный ответ, который я могу придумать, заключается в том, что html-код, который вы указали в верхней части своего сообщения, отсутствует на странице при ее первой загрузке; должен быть какой-то javascript, который динамически добавляет этот код на страницу при выполнении какого-либо действия.   -  person John Gordon    schedule 27.10.2017
comment
Хорошо, спасибо за попытку. Я думаю, вы были правы насчет сайта, запрещающего клиентов-роботов. Я проверил файл robots.txt, и он запрещает доступ к этому полю поиска. Похоже, мне придется найти другой способ получить результаты поиска для этого сайта, возможно, добавив аббревиатуру штата к исходному URL-адресу.   -  person rakeshb    schedule 27.10.2017


Ответы (1)


Я пробовал это с Chrome:

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


url = 'https://health.usnews.com/best-hospitals/search'
location = 'Massachusetts'
# Instantiate the driver
driver = webdriver.Chrome(executable_path=r'/pathTo/chromedriver')
#driver = webdriver.PhantomJS(executable_path=r'/pathTo/phantomjs')
driver.get(url)
driver.maximize_window()
wait = WebDriverWait(driver, 20)
driver.save_screenshot('out.png');
elem=wait.until(EC.element_to_be_clickable((By.XPATH,"//div[@class='search-field-view']")))
span = elem.find_element_by_xpath("//span[@class='twitter-typeahead']")
input=span.find_element_by_xpath("//input[@class='tt-input' and @name='city']");
input.send_keys(location)
driver.save_screenshot('out2.png');

и это работает.

Но если я попробую с phantomJS, в driver.save_screenshot('out.png'); я получу:

введите здесь описание изображения

Как сказал @JonhGordon в комментариях, веб-сайт выполняет некоторые проверки. Если вы хотите использовать phantomJS, вы можете попробовать изменить desired_capabilities или service_args.

person Davide Patti    schedule 27.10.2017