如何使用Python和Selenium迭代一个webelements列表?

时间:2017-08-31 22:17:23

标签: python selenium

我想遍历一个webelements列表并返回每个文本中的文本,但我只从第一个<h2>元素中获取文本,而不是从另一个<li>内部的其余元素中获取文本标签,然后代码存在循环

以下是我想要提取文本的Html代码的一部分:

&#13;
&#13;
<div class="KambiBC-event-page-component__column KambiBC-event-page-component__column--1">
  
            <ul class="KambiBC-list-view__column">
              <li class="KambiBC-bet-offer-category KambiBC-collapsible-container KambiBC-expanded KambiBC-bet-offer-category--hidden KambiBC-bet-offer-category--fade-in">
                <header class="KambiBC-bet-offer-category__header" data-touch-feedback="true">
                  <h2 class="KambiBC-bet-offer-category__title js-bet-offer-category-title">Piete selectate</h2>
                </header>
              </li>
              <li class="KambiBC-bet-offer-category KambiBC-collapsible-container KambiBC-expanded KambiBC-bet-offer-category--hidden KambiBC-bet-offer-category--fade-in">
                 <header class="KambiBC-bet-offer-category__header" data-touch-feedback="true">
                  <h2 class="KambiBC-bet-offer-category__title js-bet-offer-category-title">Another text</h2>
                 </header>
              </li>

              <li class="KambiBC-bet-offer-category KambiBC-collapsible-container KambiBC-bet-offer-category--hidden KambiBC-bet-offer-category--fade-in">
                 <header class="KambiBC-bet-offer-category__header" data-touch-feedback="true">
                  <h2 class="KambiBC-bet-offer-category__title js-bet-offer-category-title">Different text</h2>
                 </header>
			 </li>
				
              <li class="KambiBC-bet-offer-category KambiBC-collapsible-container KambiBC-bet-offer-category--hidden KambiBC-bet-offer-category--fade-in">
                 <header class="KambiBC-bet-offer-category__header" data-touch-feedback="true">
                  <h2 class="KambiBC-bet-offer-category__title js-bet-offer-category-title">Yet another text</h2>
                 </header>
              </li>
				
            </ul>
                  
      
      </div>
&#13;
&#13;
&#13;

这是Pyhton代码:

&#13;
&#13;
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Edge("D:\pariuri\python\MicrosoftWebDriver.exe")
driver.implicitly_wait(5)

driver.get("https://www.unibet.ro/betting#filter/football")

try:
    element_present = EC.presence_of_element_located((By.CLASS_NAME, 'KambiBC-event-result__score-list'))
    WebDriverWait(driver, 4).until(element_present)
except TimeoutException:
    print ('Timed out waiting for page to load') 

event = driver.find_elements_by_class_name('KambiBC-event-item KambiBC-event-item--type-match') 

for items in event:
   link = items.find_element_by_class_name('KambiBC-event-item__link')
   scoruri =  items.find_element_by_class_name('KambiBC-event-item__score-container') 
   
   scor1 =  scoruri.find_element_by_xpath(".//li[@class='KambiBC-event-result__match']/span[1]")
   scor2 =  scoruri.find_element_by_xpath(".//li[@class='KambiBC-event-result__match']/span[2]")
   
   print (scor1.text)
   print (scor2.text)
   if scor1.text == '0' and scor2.text == '0':
       

        link.click()
        time.sleep(3)


        PlajePariuri = driver.find_elements_by_xpath("//ul[@class='KambiBC-list-view__column']")
        for items in PlajePariuri:
             NumePlaje = items.find_element_by_xpath("//li/header/h2")
             print (NumePlaje.text)

           
        
     
&#13;
&#13;
&#13;

4 个答案:

答案 0 :(得分:2)

一直在我的脸上,这将打印每个元素的文字,很高兴我能找到

PlajePariuri = driver.find_elements_by_class_name('KambiBC-bet-offer-category KambiBC-collapsible-container KambiBC-expanded KambiBC-bet-offer-category--hidden KambiBC-bet-offer-category--fade-in')


    for items2 in PlajePariuri:

        NumePlaje = items2.find_element_by_class_name('KambiBC-bet-offer-category__title js-bet-offer-category-title')

        print (NumePlaje.text)

答案 1 :(得分:1)

不要使用classname定位器,请尝试使用xpath,如下所示:

PlajePariuri = driver.find_elements_by_xpath("//ul[@class='KambiBC-list-view__column']")
for items in PlajePariuri:
    NumePlaje = items.find_element_by_xpath("//li/header/h2")
    print (NumePlaje.text)

答案 2 :(得分:1)

尝试以下代码 -

PlajePariuri = driver.find_elements_by_xpath("//ul[@class='KambiBC-list-view__column']//li/header/h2")
for items in PlajePariuri:
    print (items.text)

答案 3 :(得分:0)

我做了一个实现,可以在列表中查找元素。

我的情况是,我们有一个带有附带列表的Wiki,其侧面列表中可能有也可能没有列表,依此类推。 这是我的解决方案:

// #Create a function to receive the old HTML (Before click), 
// #new HTML (After click), and the element I'm looking for:

def page_handler(old_source,new_source,element):
    new_content = []

    // #Put page into a list (need to verify if it works for you)
    old_page = old_source.split('\n')
    new_page = new_source.split('\n')

    // #Compare the old page and new page. The content of the new page, I check if 
    // #matches with the element I'm looking for

    for data in new_page:
        if data not in old_page:
            if element in data:
                new_content.append(data)

    return new_content

// #Now in the main thread, before the program Click on the item, take a snapshot:
old_page = driver.page_source

// #Click on the item
elem = driver.find_element_by_link_text(item).click()

// #take a new snapshot
new_page = driver.page_source

// # Use the function to send the old page and new page, and the class you are looking 
// #for in the HTML code:
new_pg_data = page_handler(old_page,new_page,'class="plugin_pagetree_children_span"')

// # Now I have the children elements, just iterate the list.

for element_id in new_pg_data:
    // #I use regexp to get the element ID
    element_id = search('id="(.*)">  ',element_id)
    if element_id:
        elem = driver.find_element_by_id(element_id).click()

我希望此解决方案可以对您有所帮助。