如何使用Selenium重复获取内容<Python>?
How to use Selenium to repeatedly obtain content <Python>?
我正在抓取来自 here 的文本。我需要反复点击 "Load More Arguments" 来获取页面上列出的所有参数。这是我的代码:
try:
while True:
link = WebDriverWait(driver, 5).until(
EC.element_to_be_clickable((By.LINK_TEXT, "Load More Arguments")))
ActionChains(driver).move_to_element(link).perform()
link.click()
time.sleep(3) #wait for the update to occurr so the page loads"new arguments for you"
print(driver.execute_script("return document.documentElement.outerHTML;"))
if not (link):
break
finally:
None
这是错误:
File "debate.py", line 42, in <module>
EC.element_to_be_clickable((By.LINK_TEXT, "Load More Arguments")))
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium-2.44.0-py2.7.egg/selenium/webdriver/support/wait.py", line 71, in until
raise TimeoutException(message)
selenium.common.exceptions.TimeoutException: Message:
我确实获得了页面上列出的参数,但我认为我的代码有点奇怪,尤其是在循环中。我想我需要一些东西来代替 "if not",比如 "not clickable"。你能给我一些建议吗?
谢谢。
是的,if not link:
不是您想要的条件。如果这个条件永远为真,那么你的 move_to_element
和 click
都不会起作用,因为它们和你的 if not link:
测试之间没有任何东西可以改变 link
引用一个元素是 None
(或其他一些错误值)。 link
包含的元素引用可能会变成 stale,但此类问题会生成一个特定的异常。没有什么魔法可以将对 None
.
的陈旧引用变成
很有可能,您当前 运行 进入的超时事件表明您已完成。我希望加载更多参数的按钮在加载所有内容后不可点击(因为它不再存在或因为它被禁用)。 (我无法验证这一点,因为你提供的 link 让我进入了一个没有说明问题的页面。)
如果中断异常,则可以退出循环。这也处理了尚无参数或没有 足够 个参数来保证按钮存在的情况:
from selenium.common.exceptions import TimeoutException
[....]
while True:
try:
link = WebDriverWait(driver, 5).until(
EC.element_to_be_clickable((By.LINK_TEXT, "Load More Arguments")))
except TimeoutException:
break
[...]
一些注意事项:
外面的 try... finally
块似乎没有做任何事情。
通常,您可以在一次操作中移动并单击 link link.click()
应该可以在没有 ActionChains
的情况下工作。在一些相当罕见的情况下,您需要在点击之前执行移动。
您应该将 time.sleep
调用替换为检查页面状态以确定参数何时完成加载的显式等待。
我正在抓取来自 here 的文本。我需要反复点击 "Load More Arguments" 来获取页面上列出的所有参数。这是我的代码:
try:
while True:
link = WebDriverWait(driver, 5).until(
EC.element_to_be_clickable((By.LINK_TEXT, "Load More Arguments")))
ActionChains(driver).move_to_element(link).perform()
link.click()
time.sleep(3) #wait for the update to occurr so the page loads"new arguments for you"
print(driver.execute_script("return document.documentElement.outerHTML;"))
if not (link):
break
finally:
None
这是错误:
File "debate.py", line 42, in <module>
EC.element_to_be_clickable((By.LINK_TEXT, "Load More Arguments")))
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium-2.44.0-py2.7.egg/selenium/webdriver/support/wait.py", line 71, in until
raise TimeoutException(message)
selenium.common.exceptions.TimeoutException: Message:
我确实获得了页面上列出的参数,但我认为我的代码有点奇怪,尤其是在循环中。我想我需要一些东西来代替 "if not",比如 "not clickable"。你能给我一些建议吗?
谢谢。
是的,if not link:
不是您想要的条件。如果这个条件永远为真,那么你的 move_to_element
和 click
都不会起作用,因为它们和你的 if not link:
测试之间没有任何东西可以改变 link
引用一个元素是 None
(或其他一些错误值)。 link
包含的元素引用可能会变成 stale,但此类问题会生成一个特定的异常。没有什么魔法可以将对 None
.
很有可能,您当前 运行 进入的超时事件表明您已完成。我希望加载更多参数的按钮在加载所有内容后不可点击(因为它不再存在或因为它被禁用)。 (我无法验证这一点,因为你提供的 link 让我进入了一个没有说明问题的页面。)
如果中断异常,则可以退出循环。这也处理了尚无参数或没有 足够 个参数来保证按钮存在的情况:
from selenium.common.exceptions import TimeoutException
[....]
while True:
try:
link = WebDriverWait(driver, 5).until(
EC.element_to_be_clickable((By.LINK_TEXT, "Load More Arguments")))
except TimeoutException:
break
[...]
一些注意事项:
外面的
try... finally
块似乎没有做任何事情。通常,您可以在一次操作中移动并单击 link
link.click()
应该可以在没有ActionChains
的情况下工作。在一些相当罕见的情况下,您需要在点击之前执行移动。您应该将
time.sleep
调用替换为检查页面状态以确定参数何时完成加载的显式等待。