我已经在python中编写了一个与selenium结合使用的脚本,可以从网页上循环点击几个链接。首先,刮刀应该在着陆页上单击搜索按钮(不更改搜索字段中的任何内容)以填充结果。
第一步:
当结果显示时,刮刀应点击我尝试在第一张图片中显示的每个链接。 点击任何链接后,会弹出一个框,其中包含更多信息。
第二步:
在弹出框中,有几个标签隐藏了更多信息,这些信息在点击后显示(新标签在图像3中可见)。
最后:
然而,刮刀意味着继续做同样的事情,直到所有链接都耗尽为止。
我尝试过的几乎可以完成所有事情。它执行上述所有步骤(对于第一个链接)但对于第二个链接,刮刀卡在我的脚本的最后一行中,导致timeout exception
错误。任何有助于实现这一目标的帮助都将受到高度赞赏。
网址:site link
这是我到目前为止所尝试的:
from selenium import webdriver ; import time
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()
wait = WebDriverWait(driver, 10)
driver.get("https://www.mspa-ea.org/search-mspa-companies.html")
wait.until(EC.element_to_be_clickable((By.ID, "element-button"))).click() #clicking on search button
for post in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".company a"))):
post.click() #clicking on each links shown in image one
time.sleep(2)
try:
for elem in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".memberDetail .informationContainer ul li"))):
elem.click() #clicking on tabs cyclically
time.sleep(2)
except:
pass
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".memberDetail .closeDetail"))).click()
#close the pop up box.
#timeout exception throws here when it cycles for the second time
然而,在为单个链接执行所有这些操作后,当它转到另一个链接重复操作时,它会打开弹出框,而不是单击选项卡,它会直接命中最后一行并抛出{{1} }。而且,我无法摆脱我的刮刀中定义的硬编码延迟。
图像如下(一,二,三是按顺序):
https://i.stack.imgur.com/RLvVY.jpg
答案 0 :(得分:0)
当我运行您的代码时,而不是在调用click
时获取异常,我在以下行获得异常:
for elem in wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, ".memberDetail .informationContainer ul li"))):
这一行没有做你想做的事情 - 该选择器将返回页面上<li>
标签元素的全部(大约5000个),而不是只是您打开的帖子中包含的内容。
由于大多数<li>
元素都不可见(因为包含它们的弹出窗口已关闭),因此您对visibility_of_all_elements_located
的调用将超时。
您需要将上面的代码行替换为仅返回<li>
制表符元素的代码行,这些元素是当前打开的post
WebElement的后代。