Selenium查找元素方法仅driver调用生效,其他变量调用报错如何解决?
问题原因及解决方案
核心错误原因
AttributeError: 'list' object has no attribute 'find_elements_by_xpath' 报错的本质是你调用了列表对象不存在的方法:
- Selenium中所有带
s的find_elements_*系列方法,返回值都是WebElement对象组成的列表,只有单个WebElement实例、driver实例才支持调用元素查找方法,列表本身不支持该操作。
代码中存在的其他问题
- 执行顺序错误:你在未导入selenium、未实例化driver的情况下就调用了driver的相关方法,会触发未定义报错
- 循环内调用对象错误:你遍历
videos列表拿到的单个视频元素是video,但你还是用列表videos去查找子元素 - 未提取元素文本:你直接把WebElement对象存入字典,最终得到的不是标题和播放量的文本内容,需要调用
.text属性提取内容
修正后代码
# 先导包,再实例化driver from selenium import webdriver driver = webdriver.Chrome() # 注意根据你的浏览器类型选择对应驱动,提前配置好驱动路径 driver.get("填入你要爬取的频道URL") driver.implicitly_wait(10) videos = driver.find_elements_by_class_name("style-scope ytd-grid-renderer") for video in videos: # 用单个video元素查找子元素,而不是videos列表 title = video.find_element_by_xpath('.//*[@id="video-title"]').text views = video.find_element_by_xpath('.//*[@id="metadata-line"]/span[1]').text item = { 'title' : title, 'views' : views } # 这里可以加打印或者存储item的逻辑 print(item)
需掌握的核心概念
find_element_*:返回匹配到的第一个元素,为单个WebElement对象,找不到元素直接报错find_elements_*:返回所有匹配到的元素组成的列表,找不到元素返回空列表,不会报错- 只有driver和单个WebElement对象支持调用上述两类查找方法,列表、字符串等其他类型对象都不支持
内容的提问来源于stack exchange,提问作者iThat1Chinese
相关产品推荐
相关产品推荐

