无法从网页

时间:2018-04-28 09:30:35

标签: python python-3.x selenium web-scraping selenium-chromedriver

我已经在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

https://i.stack.imgur.com/OK2R4.jpg

https://i.stack.imgur.com/o7pG5.jpg

1 个答案:

答案 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的后代。