Reputation: 367
I want to iterate through a webelements list and return the text from each of them but i only get the text from the first <h2>
element and not from the rest elements that are inside the other <li>
tags, and then the code exist that loop
Here is part of the Html code from which i want to extract the text:
<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>
and this is the Python code:
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)
Upvotes: 7
Views: 34012
Reputation: 1
I did an implementation to find elements inside a list.
My case was we have a wiki with a side list that may have or may not have a list inside a list and so on. This is my solution:
// #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()
I hope this solution can help you guys.
Upvotes: 0
Reputation: 367
It was in my face all along,this will print the text from each element, glad i could find out
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)
Upvotes: 2
Reputation: 407
Try below code-
PlajePariuri = driver.find_elements_by_xpath("//ul[@class='KambiBC-list-view__column']//li/header/h2")
for items in PlajePariuri:
print (items.text)
Upvotes: 1
Reputation: 193078
Instead of using classname
locator, try using xpath
as follows:
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)
Upvotes: 2