如何在不同的选项卡/窗口中打开选择标签(下拉菜单)的选项?
Posted
技术标签:
【中文标题】如何在不同的选项卡/窗口中打开选择标签(下拉菜单)的选项?【英文标题】:How to open the option items of a select tag (dropdown) in different tabs/windows? 【发布时间】:2019-01-14 07:41:48 【问题描述】:我正在尝试使用 Python 和 Selenium 抓取该网站,它要求您从下拉框中选择一个日期,然后单击搜索以查看规划应用程序。
网址:https://services.wiltshire.gov.uk/PlanningGIS/LLPG/WeeklyList。
我的代码可以选择下拉框的第一个索引并按搜索。如何为下拉框中的所有日期选项打开多个窗口,或者一个一个地浏览它们以便我可以抓取它?
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome('/Users/weaabduljamac/Downloads/chromedriver',
chrome_options=options)
url = 'https://services.wiltshire.gov.uk/PlanningGIS/LLPG/WeeklyList'
driver.get(url)
select = Select(driver.find_element_by_xpath('//*[@id="selWeek"]'))
select.select_by_index(1)
button = driver.find_element_by_id('csbtnSearch')
button.click()
app_numbers = driver.find_element_by_xpath('//*[@id="form1"]/table/tbody/tr[1]/td[1]/a').text
print(app_numbers)
下拉框 html:
<select class="formitem" id="selWeek" name="selWeek">
<option selected="selected" value="2018,31">Week commencing Monday 30 July 2018</option>
<option value="2018,30">Week commencing Monday 23 July 2018</option>
<option value="2018,29">Week commencing Monday 16 July 2018</option>
<option value="2018,28">Week commencing Monday 9 July 2018</option>
<option value="2018,27">Week commencing Monday 2 July 2018</option>
<option value="2018,26">Week commencing Monday 25 June 2018</option>
<option value="2018,25">Week commencing Monday 18 June 2018</option>
<option value="2018,24">Week commencing Monday 11 June 2018</option>
<option value="2018,23">Week commencing Monday 4 June 2018</option>
<option value="2018,22">Week commencing Monday 28 May 2018</option>
</select>
【问题讨论】:
我猜你需要使用 switch_to_window 寻找这个帖子:***.com/questions/17325629/… 您所要求的可以在 WATIR 中轻松完成(位于 Ruby Selenium Binding 的顶部)。如果你准备好考虑 Ruby,我可以帮助你。 【参考方案1】:根据您的问题,您将无法为不同的下拉选项打开多个窗口,因为 <options>
标记不包含任何 href
属性。它们将始终在同一浏览器窗口中呈现新页面。
然而,从下拉列表中选择一个日期,然后click()
搜索来查看您可以使用以下解决方案的计划申请:
代码块:
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless')
options.add_argument("start-maximized")
options.add_argument('disable-infobars')
driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
url = 'https://services.wiltshire.gov.uk/PlanningGIS/LLPG/WeeklyList'
driver.get(url)
select = Select(driver.find_element_by_xpath("//select[@class='formitem' and @id='selWeek']"))
list_options = select.options
for item in range(len(list_options)):
select = Select(driver.find_element_by_xpath("//select[@class='formitem' and @id='selWeek']"))
select.select_by_index(str(item))
driver.find_element_by_css_selector("input.formbutton#csbtnSearch").click()
print(driver.find_element_by_xpath('//*[@id="form1"]/table/tbody/tr[1]/td[1]/a').text)
driver.get(url)
driver.quit()
控制台输出:
18/06760/FUL
18/07187/LBC
18/06843/FUL
18/06705/FUL
18/06449/FUL
18/05534/FUL
18/06030/DEM
18/05784/FUL
18/05914/LBC
18/05241/FUL
琐事
要抓取所有需要替换的链接:
find_element_by_xpath('//*[@id="form1"]/table/tbody/tr[1]/td[1]/a')
与:
find_elements_by_xpath('//*[@id="form1"]/table/tbody/tr[1]/td[1]/a')
【讨论】:
您好,感谢您的回复,这正是我想要的。我可以在去下一个日期之前刮掉每一页上的所有申请号吗? 因为理想情况下我想在每个页面上抓取申请号、地址、提案、状态,然后将其写入 json 文件 @AbdulJamaclike to scrape application number, address , proposal , status on each page
和 for all the date options in the drop-down box or go through them one by one
不一样吗?请针对您的新要求提出一个新问题。 *** 志愿者将很乐意为您提供帮助。
好的,我已经完成了,谢谢你的帮助,我真的很感激【参考方案2】:
我很确定这是不可能的,您必须遍历选项并将数据存储在某处,然后从每个下拉列表中附加新数据。
希望这会有所帮助。
【讨论】:
【参考方案3】:您可以在搜索按钮上执行click + ctrl
在新窗口中打开链接,抓取数据,然后返回第一页选择下一个选项
# original window to switch back
window_before = driver.window_handles[0]
select = Select(driver.find_element_by_id('selWeek'))
options = select.options
for option in options :
select.select_by_visible_text(option.text)
# click to open link in new window
button = driver.find_element_by_id('csbtnSearch')
ActionChains(driver).key_down(Keys.CONTROL).click(button).key_up(Keys.CONTROL).perform()
# switch to new window and scrap the data
driver.switch_to_window(driver.window_handles[1])
# scrap the data
# return to original window
driver.close()
driver.switch_to_window(window_before)
【讨论】:
是否有任何导入我得到了错误:1.'Select'的实例没有'select_by_deselect_by_visible_text'成员2.未定义的变量'ActionChains'成员3.未定义的变量'Keys' 4.未定义的变量' window_handles' @AndreiSuvorkov 在他尝试之前我们不会知道,不是吗? 我仍然得到错误:'未定义的变量'window_handles'' @AbdulJamacselect.select_by_visible_text
(一个select.
)和driver.window_handles[1]
(添加driver.
)
是的,谢谢你,现在我运行它时删除了所有代码错误,我得到 driver.switch_to_window(driver.window_handles[1]) IndexError: list index out of range以上是关于如何在不同的选项卡/窗口中打开选择标签(下拉菜单)的选项?的主要内容,如果未能解决你的问题,请参考以下文章