Bagaimana cara memilih saran pencarian menggunakan selenium? Situs ini mencegah saya dari hanya mengklik kirim, membutuhkan pilihan

Aug 18 2020

Saya mencoba membuat pencarian apartemen sementara sedikit lebih mudah bagi diri saya sendiri, tetapi situs web dengan daftar untuk apartemen ini mengharuskan saya untuk memilih saran dari daftar tarik-turun mereka sebelum saya dapat mengklik kirim. Tidak peduli seberapa lengkap entri di kotak pencarian.

Harapan utama di sini adalah saya dapat melanjutkan ke hasil pencarian dan kemudian mengekstrak informasi kontak dari setiap daftar. Saya bisa mengekstrak data yang saya butuhkan dari daftar menggunakan Beautiful soup and Requests, tetapi saya harus menempelkan URL untuk daftar spesifik itu ke dalam kode saya. Saya tidak sampai sejauh itu. Jika ada yang memiliki saran tentang bagaimana mungkin menghindari halaman arahan untuk mendapatkan daftar yang relevan, beri tahu saya.

Saya mencoba hanya menyambung nama kota dan nama negara bagian ke bilah alamat dengan melihat bagaimana itu ditulis setelah pencarian yang berhasil tetapi tidak berhasil.

Situs tersebut adalah Mein Monteurzimmer .

Ini kode saya:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select


driver = webdriver.Firefox()


webpage = r"https://mein-monteurzimmer.de"
print('Prosim vnesi zeljeno mesto') #Please enter the town to search
searchterm = input()

driver.get(webpage)

sbox = driver.find_element_by_xpath("/html/body/main/cpagearea/section/div[2]/div/section[1]/div/div[1]/section/form/div/input")
sbox.send_keys(searchterm)

ddown = driver.find_element_by_xpath("/html/body/main/cpagearea/section/div[2]/div/section[1]/div/div[1]/section/form/div")
ddown.select_by_value(1)

webdriver.wait(2)

#select = driver.find_element_by_xpath("/html/body/main/cpagearea/section/div[2]/div/section[1]/div/div[1]/section/form/div")

submit = driver.find_element_by_xpath("/html/body/main/cpagearea/section/div[2]/div/section[1]/div/div[1]/section/form/button")
submit.click

Saat saya memeriksa kotak pencarian, saya tidak dapat menemukan apapun yang berhubungan dengan saran sampai saya memasukkan teks. Kemudian saya tidak dapat mengklik kode HTML karena itu menolak saran. Ini cukup membuat frustasi.

Berikut tangkapan layarnya:

Jadi saya secara membabi buta mencoba memilih sesuatu.

Kesalahannya di sini adalah:

AttributeError: Objek 'FirefoxWebElement' tidak memiliki atribut 'select_by_value'

Saya mencoba sesuatu dengan pilih, tetapi itu tidak berhasil dengan cara saya mencoba ini.

Saya bingung dan solusi yang dapat saya temukan spesifik untuk situs lain seperti Google atau Amazon dan saya tidak bisa masuk akal jika itu.

Adakah yang tahu bagaimana saya bisa membuat ini berhasil?

Berikut kode untuk mengeluarkan informasi dari daftar, yang harus saya kembangkan untuk mendapatkan data lainnya:

import bs4, requests

def getMonteurAddress(MonteurUrl):
    res = requests.get(MonteurUrl)
    res.raise_for_status()

    soup = bs4.BeautifulSoup(res.text, 'html.parser')
    elems = soup.select('section.c:nth-child(4) > div:nth-child(2) > div:nth-child(2) > dl:nth-child(1) > dd:nth-child(2)')
    return elems[0].text.strip()




address = getMonteurAddress('https://mein-monteurzimmer.de/105742/monteurzimmer/deggendorf-monteurzimmer-deggendorf-pensionfelix%40googlemailcom')
print('Naslov je ' + address) #print call to see if it gets the right data

Jawaban

1 rahulrai Aug 18 2020 at 20:20

Seperti yang Anda lihat setelah Anda mengetik, ada daftar pembuatan div. Sekarang Anda perlu mendapatkan locator yang valid untuk div ini. Untuk mendapatkan locator untuk div yang dibuat ini, Anda perlu memeriksa elemen dalam mode jeda debug (F12 -> Tab Sumber -> F8).

Coba kode di bawah ini untuk memilih alamat pertama yang cocok saat Anda mengetik.

sbox = driver.find_element_by_xpath("//input[@placeholder='Adresse, PLZ oder Ort eingeben']")
sbox.send_keys(searchterm)
addessXpath = "//div[contains(text(),'"+searchterm+"')]"
driver.find_element_by_xpath(addessXpath).click()

Catatan: Jika ada lebih dari satu alamat yang cocok, yang pertama akan dipilih.