Reputation: 153
I have been trying to get the names of the batsmen from the page but Selenium is throwing
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".table-body__cell rankings-table__name name"}.
I am not able to get why this is happening as I am blatantly copy pasting the class name. I have tried the implicitly wait function but nothing is happening using that as well. Can someone please help me out with this.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
import pandas as pd
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
PATH = "C:\Program Files (x86)\chromedriver"
driver = webdriver.Chrome(PATH)
driver.get("https://www.icc-cricket.com/rankings/mens/player-rankings/odi/batting")
driver.implicitly_wait(20)
elements = driver.find_element_by_class_name("table-body__cell rankings-table__name name")
driver.quit()
Upvotes: 2
Views: 114
Reputation: 193258
To extract names of the batsmen from the webpage you need to induce WebDriverWait for visibility_of_all_elements_located() and you can use either of the following Locator Strategies:
Using CSS_SELECTOR:
driver.get('https://www.icc-cricket.com/rankings/mens/player-rankings/odi/batting')
print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "td.table-body__cell.rankings-table__name.name a[href^='/rankings/mens/player-rankings']")))])
Using XPATH:
driver.get('https://www.icc-cricket.com/rankings/mens/player-rankings/odi/batting')
print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//td[@class='table-body__cell rankings-table__name name']//a[starts-with(@href, '/rankings/mens/player-rankings')]")))])
Console Output:
['Virat Kohli', 'Rohit Sharma', 'Ross Taylor', 'Quinton de Kock', 'Aaron Finch', 'Jonny Bairstow', 'David Warner', 'Kane Williamson', 'Rassie van der Dussen', 'Shai Hope', 'Fakhar Zaman', 'Joe Root', 'Mushfiqur Rahim', 'Shikhar Dhawan', 'Imam-ul-Haq', 'Martin Guptill', 'Steve Smith', 'Jason Roy', 'Glenn Maxwell', 'Tamim Iqbal', 'Alex Carey', 'Paul Stirling', 'Ben Stokes', 'Eoin Morgan', 'Shakib Al Hasan', 'Lokesh Rahul', 'Tom Latham', 'David Miller', 'Jos Buttler', 'Shimron Hetmyer', 'Janneman Malan', 'Haris Sohail', 'Henry Nicholls', 'Nicholas Pooran', 'Rahmat Shah', 'Andrew Balbirnie', 'Kyle Coetzer', 'Aqib Ilyas', 'Mahmudullah', 'Brendan Taylor', 'Avishka Fernando', 'Sean Williams', 'Litton Das', 'Evin Lewis', 'Kariyawasa Asalanka', 'Harry Tector', 'Kedar Jadhav', 'Kusal Perera', 'Hardik Pandya', 'Sikandar Raza', 'Angelo Mathews', 'Hashmatullah Shaidi', 'Imad Wasim', 'Danushka Gunathilaka', 'Soumya Sarkar', 'Marcus Stoinis', 'Najibullah Zadran', 'Temba Bavuma', 'Kusal Mendis', 'Colin de Grandhomme', 'Sarfaraz Ahmed', 'Calum MacLeod', 'Marnus Labuschagne', 'Jimmy Neesham', 'Mitchell Marsh', 'Niroshan Dickwella', 'Mohammad Nabi', 'Richard Berrington', 'Craig Ervine', 'Aiden Markram', 'Assad Vala', 'William Porterfield', 'Asghar Afghan', 'Muhammad Usman', 'Heinrich Klaasen', 'Shreyas Iyer', 'Dhananjaya de Silva', 'Dasun Shanaka', 'George Munsey', 'Mitchell Santner', 'Rishabh Pant', 'Jason Holder', 'Mithun Ali', 'Andile Phehlukwayo', 'Rashid Khan', 'Ravindra Jadeja', 'Matthew Wade', 'Lahiru Thirimanne', 'Mohammad Rizwan', 'Dinesh Chandimal', 'Rovman Powell', 'Kieron Pollard', 'Zeeshan Maqsood', 'Gulbadin Naib', 'Matthew Cross', 'Moeen Ali', 'Curtis Campher', 'Chris Woakes', 'Scott Edwards']
Note : You have to add the following imports :
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
Upvotes: 1