セレンを使用して検索候補を選択するにはどうすればよいですか?このサイトでは、送信をクリックするだけでは不十分で、選択が必要です

Aug 18 2020

一時的なアパートの検索を自分で少し簡単にしようとしていますが、これらのアパートのリストが掲載されているWebサイトでは、[送信]をクリックする前にドロップダウンリストから提案を選択する必要があります。検索ボックスへの入力がどれほど完全であっても。

ここでの究極の希望は、検索結果に進んで、各リストから連絡先情報を抽出できることです。Beautiful soup and Requestsを使用してリストから必要なデータを抽出できましたが、その特定のリストのURLをコードに貼り付ける必要がありました。そんなに遠くまでは行かなかった。ランディングページを迂回して関連するリストにアクセスする方法について誰かが提案を持っている場合は、私に知らせてください。

検索に成功した後、町の名前と州の名前がどのように書かれているかを調べて、アドレスバーに接続してみましたが、うまくいきませんでした。

サイトはMeinMonteurzimmerです。

これが私のコードです:

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

検索ボックスを調べると、テキストを入力するまで提案に関連するものが見つかりません。次に、提案が却下されるため、HTMLコードをクリックできません。かなりイライラします。

これがスクリーンショットです:

だから私はやみくもに何かを選択しようとしています。

ここでのエラーは次のとおりです。

AttributeError: 'FirefoxWebElement'オブジェクトに属性がありません 'select_by_value'

selectで何かを試しましたが、これを試した方法では機能しません。

私は困惑していて、見つけた解決策はグーグルやアマゾンのような他のサイトに固有のものであり、それが意味をなさなかった。

誰かが私がこれを機能させる方法を知っていますか?

リストから情報を取得するためのコードは次のとおりです。他のデータを取得するには、このコードを拡張する必要があります。

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

回答

1 rahulrai Aug 18 2020 at 20:20

入力するとわかるように、作成しているdivのリストがあります。次に、これらのdivの有効なロケーターを取得する必要があります。これらの作成されたdivのロケーターを取得するには、デバッグ一時停止モード(F12-> [ソース]タブ-> F8)で要素を検査する必要があります。

以下のコードを試して、入力時に最初に一致するアドレスを選択してください。

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

注:一致するアドレスが複数ある場合は、最初のアドレスが選択されます。