我试图将Lynda.com提供的所有课程的名称与主题一起提取出来,以便它在我的列表中显示为'2D Drawing - Project Soane:用Paul F. Aubin恢复BIM失落的纪念碑”。因此,我正在尝试编写一个脚本,该脚本将转到http://www.lynda.com/sitemap/categories上的每个主题并提取课程列表。我已经设法让Selenium从一个主题转到另一个主题并拉出课程。我唯一的问题是有一个按钮'查看X更多课程'以查看其余课程。有时你必须点击它几次,这就是我使用while循环的原因。但是硒似乎没有执行此点击。有谁知道为什么?
这是我的代码:
from selenium import webdriver
url = 'http://www.lynda.com/sitemap/categories'
mydriver = webdriver.Chrome()
mydriver.get(url)
course_list = []
for a in [1,2,3]:
for b in range(1,73):
mydriver.find_element_by_xpath('//*[@id="main-content"]/div[2]/div[3]/div[%d]/ul/li[%d]/a' % (a,b)).click()
while True:
#click the button 'See more results' as long as it´s available
try:
mydriver.find_element_by_xpath('//*[@id="main-content"]/div[1]/div[3]/button').click()
except:
break
subject = mydriver.find_element_by_tag_name('h1') # pull out the subject
courses = mydriver.find_elements_by_tag_name('h3') # pull out the courses
for course in courses:
course_list.append(str(subject.text)+" -- " + str(course.text))
# go back to the initial site
mydriver.get(url)
答案 0 :(得分:1)
点击前滚动到元素:
see_more_results = browser.find_element_by_css_selector('button[class*=see-more-results]')
browser.execute_script('return arguments[0].scrollIntoView()', see_more_results)
see_more_results.click()
如何重复这些行动的一个解决方案可能是:
def get_number_of_courses():
return len(browser.find_elements_by_css_selector('.course-list > li'))
number_of_courses = get_number_of_courses()
while True:
try:
button = browser.find_element_by_css_selector(CSS_SELECTOR)
browser.execute_script('return arguments[0].scrollIntoView()', button)
button.click()
while True:
new_number_of_courses = get_number_of_courses()
if (new_number_of_courses > number_of_courses):
number_of_courses = new_number_of_courses
break
except:
break
警告:使用内置显式等待总是比while True
更好:
http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-waits
答案 1 :(得分:0)
问题是你正在调用一个方法来按类名查找元素,但是你传递了一个xpath。如果你确定这是正确的xpath,你只需要将方法更改为'find_element_by_xpath'。 如果您允许,建议:尝试远离这些长xpath,并通过一些有关如何编写高效xpath的教程。