Python 3.x Selenium只获取一个结果,而忽略其他相关结果
我是硒的新手。搜索一个网站,我得到10个结果,每一页。这些结果在页面上显示为列表(li标记),每个列表包含相同的属性。当我的条件满足时,我会转到另一个相关的网页并获得所需的内容。但是,当我的代码不断循环列表时,它无法找到其他列表的相同属性。这是我的密码:Python 3.x Selenium只获取一个结果,而忽略其他相关结果,python-3.x,selenium,Python 3.x,Selenium,我是硒的新手。搜索一个网站,我得到10个结果,每一页。这些结果在页面上显示为列表(li标记),每个列表包含相同的属性。当我的条件满足时,我会转到另一个相关的网页并获得所需的内容。但是,当我的代码不断循环列表时,它无法找到其他列表的相同属性。这是我的密码: p_url = "https://www.linkedin.com/vsearch/f?keywords=BARCO%2BNV%2Bkortrijk&pt=people&page_num=5"
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\u emp=emp.find\u element\u by\u css\u选择器(“a.title.main headline”)
在第一次工作后停止工作。结果,我得到了一个错误Message:stale element reference:element未附加到页面文档
从stackoverflow的问题中,我看到一些人说内容已经从DOM结构中删除,还有人建议从另一篇文章中用结果填充列表。这里是我尝试的emp_list=[]
对于范围内的i(len(员工)):
emp_list.append(employees[i])
,但是,它也不起作用
如何克服此问题?您使用的选择器错误。您正在使用
results容器
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\u emp.send\u键(keys.COMMAND+'t')
您使用的选择器错误。您正在使用results容器
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\u emp.send\u keys(keys.COMMAND+'t')
您可以共享您正在使用的HTML吗?我刚刚检查了您进入的页面,当我进入results container
div
时,没有一个li
是此元素的直接子元素,但您说它适用于第一个员工。您可以共享您使用的HTML吗?我刚刚检查了您进入的页面,当我进入结果容器div
时,没有一个li
是此元素的直接子元素,但您说它适用于第一个员工。感谢您的回答。然而,我仍然有同样的问题。在相关网页中,此代码适用于第三个成员并获取内容。在同一页中,代码msut适用于第四个成员。但是我仍然有陈旧的元素引用:元素未附加到页面文档中
错误。我的猜测是,在循环中,我转到“成员配置文件”页面,当这种情况发生时,员工保存的所有信息都将丢失。@mlee_jordan是的,这正是发生的情况。@mlee_jordan检查我的新编辑。这可能对你有帮助。谢谢你的回答。然而,我仍然有同样的问题。在相关网页中,此代码适用于第三个成员并获取内容。在同一页中,代码msut适用于第四个成员。但是我仍然有陈旧的元素引用:元素未附加到页面文档中
错误。我的猜测是,在循环中,我转到“成员配置文件”页面,当这种情况发生时,员工保存的所有信息都将丢失。@mlee_jordan是的,这正是发生的情况。@mlee_jordan检查我的新编辑。这可能对你有帮助。