【发布时间】:2018-06-11 19:52:24
【问题描述】:
我在 python 中结合 selenium 编写了一个脚本来解开连接到三个按钮中的两个按钮的两个框。然后在这两个框中有几个字段可以选中或取消选中选项。
使用以下脚本,我可以检查所需的框是否连接到前两个按钮,但问题是我执行整个操作的方式非常不整洁。我怎样才能有效地做到这一点?
我尝试过的脚本:
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
driver = webdriver.Chrome()
driver.get("http://urbantoronto.ca/database/")
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#filter_status_arrow"))).click()
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#check_pre_construction"))).click()
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#check_complete"))).click()
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#filter_project_type_arrow"))).click()
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#check_condo"))).click()
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#check_co_op"))).click()
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#check_house"))).click()
driver.quit()
当我选择所需的字段时,他们look like this。
我怎样才能有效地做到这一点?
【问题讨论】:
-
嗯,这取决于您所说的高效。如果您想单击每个单独的按钮,则您的解决方案在执行时间方面的效率几乎是一样的。如果您希望代码更整洁,您可以制作一个需要单击的 css 选择器列表并循环遍历它。如果您希望代码更快,只需直接从数据库页面的源代码中获取 JSON,然后使用
json库从那里过滤。 -
是的,n1c9,你是对的。我打算使用循环做同样的事情,但找不到这样做的想法。至于 json 链接,我找不到使用开发工具的链接。但是,我检查了源代码,但也找不到它。不过,它应该在那里。
-
它在一个名为
projects的变量中,就在<link rel="shortcut icon" href="//urbantoronto.ca/sites/all/themes/urbane/favicon.ico" /></script>位之后。我试图将其复制并粘贴到 pastebucket 但它太大了。 -
哦,我明白了!我已经遇到过,但是没有链接到那个项目导致 json 的东西。
-
该项目变量的内容 是 JSON - 它都是直接从页面加载的,而不是从外部源加载的。如果它来自外部来源,通常查看网络选项卡并过滤 XHR 请求有助于揭开它的神秘面纱。
标签: python python-3.x selenium selenium-webdriver web-scraping