python - 如何使用 selenium 选择搜索建议?该网站阻止我点击提交,需要选择
问题描述
我正在尝试让自己更轻松地搜索临时公寓,但是一个包含这些公寓列表的网站要求我从他们的下拉列表中选择一个建议,然后才能单击提交。无论搜索框中的条目多么完整。
这里的最终希望是我可以前进到搜索结果,然后从每个列表中提取联系信息。我能够使用 Beautiful soup 和 Requests 从列表中提取我需要的数据,但我必须将特定列表的 URL 粘贴到我的代码中。我没有走那么远。如果有人对如何绕过登录页面以访问相关列表有任何建议,请告诉我。
我尝试将城镇名称和州名称拼接到地址栏中,查看成功搜索后的写法,但没有奏效。
该网站是Mein Monteurzimmer。
这是我的代码:
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”
我尝试了一些选择,但这不适用于我尝试的方式。
我被难住了,我能找到的解决方案是专门针对谷歌或亚马逊等其他网站的,如果是这样,我就没有意义了。
有谁知道我怎样才能做到这一点?
这是从列表中获取信息的代码,我将不得不对其进行扩展以获取其他数据:
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
解决方案
正如您所看到的,一旦您输入,就会创建一个 div 列表。现在您需要为这些 div 获取有效的定位器。要获取这些创建的 div 的定位器,您需要在调试暂停模式下检查元素(F12--> Source Tab --> 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()
注意:如果有多个匹配地址,将选择第一个。
推荐阅读
- reactjs - 如何在不改变其他卡位置的情况下交换两张卡
- javascript - 我如何获得一个元素来检测鼠标悬停
- python-3.x - 调用多进程时docker服务器挂起并给出此错误
- java - ArrayList 的烦恼
- javascript - Bootstrap v3.3.6 下拉菜单不适用于动态元素
- c++ - 在继承 C++ 中调用 main 中的参数化构造函数
- javascript - firebase onAuthStateChanged 用户不应为空
- stack - AppleScript 在更改文件扩展名时抛出堆栈溢出错误
- azure - 将 SAS 令牌重写(附加)到 azure cdn 中的 url
- python - 使用 Galaxy Zoo 数据集、TensorFlow 和 Keras 训练 GAN