硒 - 点击一个按钮

时间:2015-12-14 15:17:47

标签: python-3.x selenium web-scraping

我试图将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)

2 个答案:

答案 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的教程。