Selenium.common.Exceptions.NoSuchElementException: Pesan: {errorMessage:Tidak dapat menemukan elemen dengan id 'search-facet-city'

Saya mencoba mengikis situs web berikut menggunakan Python 3, Selenium, dan PhantomJS:

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

Saya perlu mencari bidang pencarian dan memasukkan teks ke dalamnya, lalu tekan enter untuk menghasilkan hasil pencarian. Di bawah ini adalah HTML yang sesuai dengan bidang pencarian yang saya coba cari:

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

Di bawah ini adalah kode Python 3 saya yang mencoba menemukan bidang pencarian ini menggunakan id "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()

Saya perlu mengambil beberapa hasil dari halaman setelah teks dimasukkan ke dalam kolom pencarian. Namun, saya terus mendapatkan kesalahan NoSuchElementException; ia tidak dapat menemukan elemen kotak pencarian meskipun faktanya elemen itu ada. Bagaimana cara memperbaikinya?


person rakeshb    schedule 27.10.2017    source sumber
comment
Kesalahan pada judul postingan Anda adalah mencari kota segi pencarian sebagai kelas, tetapi kode postingan Anda mencarinya sebagai id. Yang mana?   -  person John Gordon    schedule 27.10.2017
comment
Maaf, itu salah ketik. Itu harusnya identitas.   -  person rakeshb    schedule 27.10.2017
comment
Saat saya mencoba mengambil url itu, saya mendapat respons 403 Forbidden. Apakah kamu yakin bisa membacanya?   -  person John Gordon    schedule 27.10.2017
comment
Ya, saya bisa membaca urlnya. Saya dapat mengambil beberapa teks dari url, tetapi masalah utama saya adalah menemukan kotak pencarian dan memasukkan teks ke dalamnya. Saya tidak begitu yakin apa yang menyebabkan respons 403 Terlarang. Sudahkah Anda memasukkan semua impor yang diperlukan?   -  person rakeshb    schedule 27.10.2017
comment
Saya mendapatkan 403 dari wget di baris perintah. Situs web tersebut mungkin tidak mengizinkan klien tipe robot. Saya mencoba url di chrome dan halaman dimuat, namun Mac saya benar-benar terhenti ketika saya mencoba melihat sumbernya, jadi saya rasa saya tidak akan mengunjungi halaman itu lagi.   -  person John Gordon    schedule 27.10.2017
comment
Satu-satunya jawaban yang dapat saya berikan adalah bahwa kode html yang Anda berikan di bagian atas posting Anda tidak ada di halaman saat pertama kali dimuat; harus ada beberapa javascript yang secara dinamis menambahkan kode tersebut ke halaman ketika beberapa tindakan dilakukan.   -  person John Gordon    schedule 27.10.2017
comment
Oke, terima kasih sudah mencoba. Saya pikir Anda benar tentang situs web yang melarang klien tipe robot. Saya memeriksa file robots.txt dan tidak mengizinkan akses ke kotak kolom pencarian tersebut. Sepertinya saya harus mencari cara lain untuk mendapatkan hasil pencarian situs ini, mungkin dengan menambahkan singkatan negara bagian ke url aslinya.   -  person rakeshb    schedule 27.10.2017


Jawaban (1)


Saya mencoba ini dengan 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');

dan itu berhasil.

Tetapi jika saya mencoba dengan phantomJS, di driver.save_screenshot('out.png'); saya mendapatkan:

masukkan deskripsi gambar di sini

Seperti yang dikatakan @JonhGordon di komentar, situs web melakukan beberapa pemeriksaan. Jika Anda ingin menggunakan phantomJS, Anda dapat mencoba mengubah desired_capabilities atau service_args.

person Davide Patti    schedule 27.10.2017