Python使用Selenium按类名定位元素失败,原因及解决方案是什么?
问题原因
By.CLASS_NAME仅支持传入单个类名:你传入的h4 mb-10是两个独立类名,Selenium会将其识别为单个类名进行匹配,自然无法找到对应元素。- CSS选择器语法错误:你编写的
.h4 mb-10选择器的语义是「匹配类为h4的元素后代中名为mb-10的标签」,并非你预期的「匹配同时包含h4和mb-10两个类的元素」。
修正方案
不需要使用XPath,仅修改CSS选择器写法即可:多类名定位的CSS选择器需要给每个类名前加.,且类名之间不需要加空格,同时可以加上目标元素的标签名h3缩小匹配范围,避免匹配到另外两个同类名的元素。
修正后的核心代码如下:
#!/usr/bin/python3 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 path = "/usr/local/bin/chromedriver" driver = webdriver.Chrome(path) driver.get("https://blockchair.com/dogecoin/nodes") def scraping_fnd(): try: # 修正CSS选择器,匹配同时有h4、mb-10类的h3标签 nodes = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "h3.h4.mb-10"))) nodes_text = nodes.text print(nodes_text) finally: driver.quit() scraping_fnd()
如果需要从3个同类名元素中手动选第一个,也可以用find_elements方法获取全部匹配元素后取索引:
nodes_list = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".h4.mb-10"))) # 索引0对应第一个匹配元素,也就是你要的Total nodes元素 print(nodes_list[0].text)
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

