【问题标题】:Can't make a loop run in my script无法在我的脚本中运行循环
【发布时间】:2017-11-05 14:21:52
【问题描述】:

这是The Link这个帖子的后续问题。我希望我的脚本从第一页解析姓名和电话,然后单击下一页按钮并执行相同操作,直到所有下一页链接都用尽。但是,当我单独执行下面的脚本(while 循环中的部分)时,它可以工作,但是当两者都被包裹在 while 循环中时,后一部分,我的意思是分页部分无法执行。我尝试了几次,但结果总是一样的。我该如何修复它,以便它从第一页解析文档并单击下一页链接来完成剩下的工作?

脚本:

while True:
    for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".ajaxBtn"))):
        item.click()
        time.sleep(3)
        root = fromstring(driver.page_source)
        try:
            name = root.cssselect("#popclick .modal-header .h4")[0].text.strip()
            phone = root.cssselect("td:contains('Phone:')+td")[0].text.strip()
        except:
            pass
        print(name,phone)
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#popclick .modal-header button"))).click()
        driver.execute_script("window.scrollTo(0, {})".format(item.location['y']))

    try:
        link = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, ">")))
        link.click()
        wait.until(EC.staleness_of(link))
    except:
        break

【问题讨论】:

  • 如何在任何地方插入time.sleep(3)。手动和while-loop之间的区别只是我认为的时间。

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


【解决方案1】:

当您只是遍历所有页面时,您单击顶部分页(可见的一个)上的“>”按钮,但是当您在抓取的同时执行相同操作时,您会将页面向下滚动到底部分页。在这种情况下,顶部分页不再可见,因此您的循环制动

try:
    link = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, ">")))
    link.click()

因为你不能点击顶部的“>”。

您需要处理底部分页。只需替换

link = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, ">")))

link = driver.find_elements_by_link_text(">")[1]

【讨论】:

  • 你是无敌的安德森爵士。刚刚好。我可以理解这个概念,但很想知道为什么索引变成[1] 而不仅仅是[0]。虽然你说得很清楚,但如果你对它做一个单行评论,对我来说会更容易。再次感谢先生。
  • Index [0] 用于顶部分页上的“>”,[1] 用于底部分页上的相同
  • 感谢先生所做的一切。
猜你喜欢
  • 1970-01-01
  • 2019-04-30
  • 2021-08-27
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 2017-03-28
  • 1970-01-01
相关资源
最近更新 更多