0

我正在抓取具有以下结构的网络

Menu1
  Submenu1
    Event1
    Event2
    ...
  Submenu2
    Event n
    ...
  ...
Menu2
  ....

在哪里可以访问子菜单您必须单击菜单,以便展开节点并使子菜单列表可见,并且要访问事件列表相同,您需要单击相应的子菜单节点。获得事件后,单击它并转到另一个页面。刮完一些后,你回到上一页刮下一个事件。代码如下

browser=webdriver.Chrome()
browser.get(url)

Menu1=browser.find_element_by_xpath('some expression')
Menu1.click()

submenu=Menu1.find_elements_by_xpath('some other expression')
for sub in submenu:
   event=sub.find_elements_by_xpath('expression here')
   for ev in event:
     event.click()
     Some scraping
     'Go back to previous page'
     browser.execute_script("window.history.go(-1)")

在尝试为 Event2 进行第二次迭代时进行第一次迭代后,我得到了 NoSuchElementException,主要是因为返回列表后没有展开,因此并非所有对象都可见以继续进行 for 循环。

有什么方法适合代码来解决这个问题吗?我的猜测是,如果我Menu1再次单击,所有子菜单元素都将可见,因此该列表将再次可用。之后,如果我单击,sub则事件列表也将可用。

渴望阅读您的建议谢谢

4

1 回答 1

0

因此,本质上,我想到的解决方案是为每个菜单生成几个列表,以及节点的文本。迭代 for 循环而不是节点,节点名称的循环是不变的。然后,对于每个节点名称,遍历对象直到找到它,然后单击该特定项目。

然后重复,直到你到达所有节点。

于 2018-03-08T14:25:50.707 回答