【问题标题】:Selenium scrapes only one result and ignores other related reultsSelenium 只抓取一个结果并忽略其他相关结果
【发布时间】:2016-06-16 10:11:26
【问题描述】:

我是硒的新手。搜索一个网站,我每页得到 10 个结果。这些结果在页面上显示为列表(li 标签),每个列表都包含相同的属性。当满足我的条件时,我会转到另一个相关网页并获取所需的内容。但是,当我的代码不断循环列表时,它无法为其他列表找到相同的属性。这是我的代码:

        p_url = "https://www.linkedin.com/vsearch/f?keywords=BARCO%2BNV%2Bkortrijk&pt=people&page_num=5"             
        driver.get(p_url)

        time.sleep(5)

        results = driver.find_element_by_id("results-container")
        employees = results.find_elements_by_tag_name('li')

        #emp_list = []
        #for i in range(len(employees)):
        #    emp_list.append(employees[i])


        for emp in employees:
            try:

                main_emp = emp.find_element_by_css_selector("a.title.main-headline")
                name = emp.find_element_by_css_selector("a.title.main-headline").text
                href = main_emp.get_attribute("href")

                if name != "LinkedIn Member":
                    location = emp.find_element_by_class_name("demographic").text
                    href = main_emp.get_attribute("href")
                    print(href)
                    print(location)

                    driver.get(href)
                    exp = driver.find_element_by_id("background-experience")

                    amkk = exp.find_elements_by_class_name("editable-item")

                    for amk in amkk:
                        him = amk.find_element_by_tag_name("header").text
                        him2 = amk.find_element_by_class_name("experience-date-locale").text

                        if '\n' in him:
                            a = him.split('\n')
                            print(a[0])
                            print(a[1])

                        print(him2)

            except Exception as exc:
                print(exc)
                continue

在此代码中,main_emp = emp.find_element_by_css_selector("a.title.main-headline") 行在第一次工作后停止工作。结果我得到了Message: stale element reference: element is not attached to the page document的错误

从 stackoverflow 问题中,我看到有人说内容已从 DOM 结构中删除,而另一篇帖子中有人建议用结果填充列表。这是我尝试过的emp_list = [] for i in range(len(employees)): emp_list.append(employees[i]),但是也没有成功。

我该如何克服这个问题?

【问题讨论】:

  • 你能分享你正在使用的 HTML 吗?我刚刚检查了您访问的页面,当我访问 results-container div 时,没有一个 li 是该元素的直接子元素,但您说它适用于第一个员工。

标签: python-3.x selenium


【解决方案1】:

您使用的选择器错误。您正在使用results-container id 获得结果。这工作正常,但收集元素形式这是行不通的。它返回的元素不仅仅是员工(我不太清楚为什么)。

如果您将选择器更改为单个选择器,您将只获得员工,而没有其他不需要的元素。

employees = results.find_elements_by_css_selector("ol[id='results']>li")

编辑 由于您正在打开员工并丢失了元素列表,您可能想尝试在新选项卡中打开员工,请在此处执行您的操作,然后关闭选项卡。

例子:

    for emp in employees:
            try:
                    main_emp = emp.find_element_by_css_selector("a.title.main-headline")
                    # Do stuff you need...

                    # Open employee in new tab (make sure Keys is imported)
                    main_emp.send_keys(Keys.CONTROL + 't')
                    # Focus on new tab
                    driver.switch_to_window(d.window_handles[1])

                    # Do stuff inside the employee page
                    # Close the tab you opened
                    driver.close()
                    # Switch back to the first tab
                    driver.switch_to_window(d.window_handles[0])

注意:对于OSX,您应该使用main_emp.send_keys(Keys.COMMAND + 't')

【讨论】:

  • 感谢您的回答 RemcoW。但是,我仍然有同样的问题。在相关网页中,此代码适用于第三个成员并获取内容。在同一页面中,代码 msut 适用于第 4 个成员。但我仍然有stale element reference: element is not attached to the page document 错误。我的猜测是,在循环中,我会转到会员资料页面,当这种情况发生时,employees 保存的所有信息都会丢失。
  • @mlee_jordan 是的,这正是正在发生的事情。
  • @mlee_jordan 检查我的新编辑。这可能会对您有所帮助。
猜你喜欢
  • 2016-10-16
  • 2013-11-30
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多