Python使用Selenium如何通过类名定位元素并打印文本?
问题核心原因
- 第一个错误是定位方式匹配错误:你使用
By.ID去查找元素,但你传入的"Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)"是目标元素的class属性值,并非id属性值,目标元素本身没有设置id属性,自然无法通过ID定位到。 - 第二个错误是类名定位规则误用:就算你把定位方式改成
By.CLASS_NAME也无法成功,因为By.CLASS_NAME只支持传入单个类名,你传入的是多个类名用空格拼接的字符串,不符合规则。
修正方案
推荐用By.CSS_SELECTOR匹配多个类名,类名前加.,空格分隔不同类即可,修正后的代码如下:
try: # 把By.ID改成By.CSS_SELECTOR,特殊字符括号加反斜杠转义 price = wait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".Trsdu\\(0.3s\\).Fw\\(b\\).Fz\\(36px\\).Mb\\(-4px\\).D\\(ib\\)"))).text print(price) except Exception: print("element not found") finally: driver.quit()
也可以改用XPATH定位,写法如下:
price = wait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//span[@class="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)"]'))).text
其他排查点
如果修改后仍然定位失败,可以按以下顺序排查:
- 把等待条件换成
EC.visibility_of_element_located代替presence_of_element_located,确保元素完全渲染可见后再取值,适配雅虎财经的动态加载逻辑 - 确认页面没有iframe嵌套,如果目标元素在iframe内,需要先调用
driver.switch_to.frame()切换到对应iframe再执行定位 - 检查是否触发了反爬验证页面,导致实际返回的页面结构和预期不一致
内容的提问来源于stack exchange,提问作者ubant
相关产品推荐
相关产品推荐

