2017-07-06 52 views
0

想知道是否有人可以给我一些建议,将Selenium和Python一起用于网页浏览。Selenium Python Selector返回太多的值

我需要得到的元素数与页面上一定的阶级,而且我已经与

driver=webdriver.PhantomJS() 
driver.get('https://www.somerandomsite.com/1') 
number_of_elements = len(driver.find_elements_by_class_name('some_class')) 

这个每次都使元素的权数运作良好。

但现在我要定义一个函数,因此它可以刮去多个网页 - 说https://www.somerandomsite.com/1https://www.somerandomsite.com/10

所以我做

driver=webdriver.PhantomJS() 
def my_func(start,end) 
    while start <= end: 
     driver.get('https://www.somerandomsite.com/'+str(start)) 
     number_of_elements = len(driver.find_elements_by_class_name('some_class')) 
     start += 1 

从理论上讲,这应该进入下一个页面,检索我希望在该页面中的类的数量。但是,对于第一页,它可以正常工作,但后续页面会生成许多元素,这些元素的数量等于上一页的元素数加上当前页的元素数,或者总和减1.如果我使用xpath而不是一个类名选择器我得到完全相同的结果。另外,如果我尝试访问位于较长列表中的任何元素,则会抛出一个错误,因为只有该页面上的值实际存在。所以我不知道它是如何得到更长的列表,如果它的元素不存在。 (例如,如果第一页上有8个元素,第二页上有5个元素,当它到达第二页时,它会说有12或13个元素。如果我访问元素1-5,它们都会返回值,但尝试要调用第六个元素或更高将导致NoSuchElementException。)

任何人都知道为什么会发生这种情况?

编辑:我缩小了一点,希望这有助于。对不起,我在最初的问题。

driver=webdriver.PhantomJS() 
def my_func(start,end) 
    while start <= end: 
     driver.get('https://www.somerandomsite.com/'+str(start)) 
     number_of_elements = len(driver.find_elements_by_class_name('some_class')) 
     start += 1 

所以上面的代码实际工作。但是,当我然后导航到另一个也具有'some_class'元素的页面,然后继续循环时,它会将前一页中的元素数添加到当前页面。

所以我的代码是这样的:

driver=webdriver.PhantomJS() 
def my_func(start,end) 
    while start <= end: 
     driver.get('https://www.somerandomsite.com/'+str(start)) 
     number_of_elements = len(driver.find_elements_by_class_name('some_class')) 
     print(number_of_elements) 
     driver.get('https://www.somerandomsite.com/otherpage') 
     start += 1 

my_func(1,2) 

所以我们说https://www.somerandomsite.com/1有类“some_class”的8个元素,https://www.somerandomsite.com/otherpage拥有一流的“some_class” 7个元素,并https://www.somerandomsite.com/2有类“some_class”的10种元素。

当我运行上面的代码,它会打印8,那么17.如果我不浏览到其他页面,并运行

driver=webdriver.PhantomJS() 
def my_func(start,end) 
    while start <= end: 
     driver.get('https://www.somerandomsite.com/'+str(start)) 
     number_of_elements = len(driver.find_elements_by_class_name('some_class')) 
     start += 1 

所以上面的代码实际工作。但是,当我然后导航到另一个也具有'some_class'元素的页面,然后继续循环时,它会将前一页中的元素数添加到当前页面。

所以我的代码是这样的:

driver=webdriver.PhantomJS() 
def my_func(start,end) 
    while start <= end: 
     driver.get('https://www.somerandomsite.com/'+str(start)) 
     number_of_elements = len(driver.find_elements_by_class_name('some_class')) 
     print(number_of_elements) 
     start += 1 

my_func(1,2) 

它会打印8 10个,因为我想它。我不确定为什么它会一次计算两页中的元素,并且只有在我事先获得另一页时。

EDIT2:所以我得到它导航到一个页面在不同的服务器上,然后再返回到我想要的网页的工作。奇怪,但我会用它。如果任何人有任何想法,为什么它不起作用,如果我不,但我仍然爱更好地理解问题。

+2

你能分享更多的代码,所需的输出和异常日志作为现在不是很清楚到底什么是你的代码错误?注意,所提供的功能是毫无意义的,因为它不打印或返回值,所以'number_of_elements'将在各 – Andersson

+0

页当然可以重新定义,遗憾的 - 希望新的编辑提供足够的细节。 –

回答

0

看看

number_of_elements = len(driver.find_elements_by_class_name('some_class')) 

在每次迭代的元素你ASIGN LEN,而是你需要总结他们,所以你的代码应该是这样的:

driver=webdriver.PhantomJS() 
def my_func(start,end): 
    count = 0 
    while start <= end: 
     driver.get('https://www.somerandomsite.com/'+str(start)) 
     count += len(driver.find_elements_by_class_name('some_class')) 
     start += 1 
1

很难说什么 - 如果有的话 - 问题在于你没有提供必要的细节来复制你描述的内容。

恕我直言,一个功能是这个简单的任务矫枉过正。只是抛弃它并创建循环。一般来说,我会把循环放在外面。

您也需要一个函数调用这个来做任何事情 - 和一个return语句。

一般类似的东西,我把循环的功能外。

像这样:

def my_func(driver, count): 
    driver.get('https://www.somerandomsite.com/%d' % count) 
    number_of_elements = len(driver.find_elements_by_class_name('some_class')) 
    return number_of_elements 

driver=webdriver.PhantomJS() 
total_element_count = 0 
count = 1 
while count < 1000: # or whatever number you need 
    number_of_elements = my_func(driver, count) 
    total_element_count += number_of_elements 
    print("[*] Elements for iteration %d: %d" % (count, number_of_elements)) 
    print("[*] Total count so far: %d" % total_element_count) 
    count +=1 
+0

对不起,如果有帮助,我添加了更多细节。我也会尝试外部循环,看看是否有效,欢呼! –

+0

不幸的是我只是尝试了外部循环,没有运气。与以前相同的结果。 –