我是硒的新手。搜索网站,每页得到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])
,然而,它也没有成功。
我怎样才能克服这个?
答案 0 :(得分:2)
您使用的选择器是错误的。您正在使用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')