使用Selenium爬取YouTube视频获取链接触发AttributeError报错如何解决
问题解决方法
报错原因
find_elements_by_id是复数查找方法,返回值是符合条件的所有WebElement组成的列表,列表对象本身没有get_attribute属性,因此触发AttributeError- 你直接调用
driver.find_elements_by_id是全局查找页面所有缩略图元素,无法和当前遍历的单个视频匹配,就算解决列表问题也拿不到对应视频的链接
修复代码
你只需要调整遍历内获取链接的逻辑,改为从当前遍历的video元素下,用单数查找方法定位对应缩略图拿href即可,修改后的完整代码如下:
from selenium import webdriver driver = webdriver.Chrome(".\chromedriver.exe") driver.get("https://www.youtube.com/c/edurekaIN/videos") driver.implicitly_wait(180) videos = driver.find_elements_by_class_name('style-scope ytd-grid-video-renderer') for video in videos: title = video.find_element_by_xpath('.//*[@id="video-title"]').text views = video.find_element_by_xpath('.//*[@id="metadata-line"]/span[1]').text when = video.find_element_by_xpath('.//*[@id="metadata-line"]/span[2]').text print(title, views, when) # 修改后的代码:从当前video下查找单个thumbnail元素拿href video_url = video.find_element_by_id("thumbnail").get_attribute('href') print(video_url)
补充注意点
- 如果部分元素查找不稳定,可以替换为xpath写法:
video.find_element_by_xpath('.//a[@id="thumbnail"]').get_attribute('href'),相对路径查找更精准 - 老版本Selenium的
find_element_by_*系列方法在Selenium 4.0+已经弃用,如果你后续升级版本可以替换为find_element(By.ID, "thumbnail")的写法,需要提前导入from selenium.webdriver.common.by import By
内容的提问来源于stack exchange,提问作者Al Baari
相关产品推荐
相关产品推荐

