使用Selenium提取HTML元素文本报WebElement不可下标的解决方法
报错原因
代码触发报错存在两个核心问题:
- 方法调用错误:
find_element()仅返回匹配到的第一个WebElement单实例,本身不支持下标索引访问,直接写[0]/[1]取值就会抛出TypeError: 'WebElement' object is not subscriptable。如果需要获取多个匹配的元素列表,必须使用带复数后缀的find_elements()方法。 - CSS选择器书写错误:原选择器中将类名
sc-7d450bff-9错误插入空格拆分为sc-7d450bff 9,而空格在CSS选择器中代表后代选择器语义,会直接导致元素匹配失败。另外代码中使用的sc-前缀类名是前端构建时生成的动态类名,后续版本迭代极易发生变动,定位稳定性很差。
修正代码
优先使用元素自带的固定业务属性data-change-key做定位,稳定性远高于动态类名,实现代码如下:
from selenium.webdriver.common.by import By # 直接通过专属自定义属性定位主客队比分元素,无需依赖父容器或动态类名 home_score = driver.find_element(By.CSS_SELECTOR, 'div[data-change-key="homeScore.display"]').text away_score = driver.find_element(By.CSS_SELECTOR, 'div[data-change-key="awayScore.display"]').text
如果需要通过父容器遍历子元素的方式实现,修正后的代码如下:
from selenium.webdriver.common.by import By # 修正父容器选择器的类名错误,再调用find_elements获取子元素列表 parent_container = driver.find_element(By.CSS_SELECTOR, "div.sc-492bf320-0.sc-7d450bff-9.crIwBV.juiSXn") score_elements = parent_container.find_elements(By.CSS_SELECTOR, "div.sc-18688171-0.fXAhuT.fBSHnS") home_score = score_elements[0].text away_score = score_elements[1].text
优先推荐第一种属性定位方案,不会因为前端样式类名更新导致定位逻辑失效。
内容的提问来源于stack exchange,提问作者PASCAL MAGONA
相关产品推荐
相关产品推荐

