Selenium按类名选取元素时出现索引越界异常问题
问题原因
find_elements_by_class_name会匹配整个页面所有带有对应类名的元素,不局限于你要提取数据的大学排名表格。该站点除了排名表格的tr标签用了odd/even类,页面其他区域(比如侧边栏、其他功能模块、表头附属结构)的元素也可能使用这两个类名,这些非表格的even类元素内部没有你要的td[1]/strong结构,所以调用find_elements_by_xpath会返回空列表,取[0]就会抛出索引越界错误。- 你打印
elementsEven[0]时,只是打印Selenium元素对象本身,只要元素存在就不会报错,只有当你访问它内部不存在的子元素时才会触发错误。前3个even类元素都是页面其他区域的无效元素,所以从下标3开始才是排名表格里的有效大学条目。
优化方案
不要直接全局搜索类名,先定位到目标排名表格,再在表格范围内筛选tr元素,避免拿到无关元素,后续就不用处理下标偏移的问题,代码稳定性更高。
优化参考代码:
import csv import os from dotenv import load_dotenv from time import sleep from selenium.webdriver.common.keys import Keys from selenium.common.exceptions import NoSuchElementException from msedge.selenium_tools import Edge, EdgeOptions # Microsoft Edge # 初始化Edge浏览器 options = EdgeOptions() options.use_chromium = True driver = Edge(executable_path='./edgedriver_win32/msedgedriver.exe', options=options) driver.get("https://www.timeshighereducation.com/news/top-100-most-influential-uk-and-us-universities-on-twitter/2013373.article") # 增加等待时间确保页面加载完成,也可以换成显式等待逻辑 sleep(3) # 先定位到目标排名表格,缩小搜索范围 target_table = driver.find_element_by_xpath("//table[.//th[contains(text(),'University')]]") # 在表格范围内找odd、even类的tr elementsOdd = target_table.find_elements_by_class_name("odd") elementsEven = target_table.find_elements_by_class_name("even") # 现在elementsOdd和elementsEven里就只有表格内的大学条目,直接从0开始访问即可 card = elementsOdd[0] text = card.find_elements_by_xpath("./td[1]/strong")[0].text split_text = text.split("\n") university_name, university_twitter_tag = split_text[0], split_text[1] print(university_name + " " + university_twitter_tag) card2 = elementsEven[0] text2 = card2.find_elements_by_xpath("./td[1]/strong")[0].text split_text2 = text2.split("\n") university_name2, university_twitter_tag2 = split_text2[0], split_text2[1] print(university_name2 + " " + university_twitter_tag2)
内容的提问来源于stack exchange,提问作者Mj _
相关产品推荐
相关产品推荐

