Selenium中get_attribute()获取video的src返回空字符串问题
问题与解决方案
问题详情
需要从网页https://mplayer.me/default.php?id=MTc3ODc3的指定video标签中提取src属性,检查元素时可见该属性(Safari中对应的XPath为//*[@id="player"]/div[2]/div[4]/video),但使用Selenium调用get_attribute("src")返回空字符串,.text同样无效。由于Chrome会返回blob格式的链接,无法获取真实的播放地址(如https://wwwx18.gogocdn.stream/videos/hls/6CjH7KUeu18L4Y7ls0ohCw/1668685924/177877/81aa0af3891f4ef11da3f67f0d43ade6/ep.1.1657688313.m3u8),因此必须使用Safari浏览器。
原代码:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By import os os.environ["SELENIUM_SERVER_JAR"] = "selenium-server-standalone-2.41.0.jar" browser = webdriver.Safari() browser.get("https://mplayer.me/default.php?id=MTc3ODc3") print(WebDriverWait(browser, 20).until(EC.visibility_of_element_located((By.TAG_NAME,"video"))).get_attribute("src")) browser.quit()
原因分析
- 定位不准确:使用
By.TAG_NAME定位video元素,可能匹配到页面中其他无src属性的video标签,导致获取的不是目标元素。 - 动态属性读取限制:部分网站通过JavaScript动态设置video的src属性,Selenium的
get_attribute方法在某些场景下只能读取元素的初始属性值(为空),无法获取动态更新后的真实值。
修改后的代码
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium import webdriver import os os.environ["SELENIUM_SERVER_JAR"] = "selenium-server-standalone-2.41.0.jar" browser = webdriver.Safari() browser.get("https://mplayer.me/default.php?id=MTc3ODc3") # 用精确XPath定位目标video元素,确保选中正确标签 target_video = WebDriverWait(browser, 20).until( EC.visibility_of_element_located((By.XPATH, '//*[@id="player"]/div[2]/div[4]/video')) ) # 两种方式尝试获取src:直接调用get_attribute + 通过JavaScript读取DOM属性 src_direct = target_video.get_attribute("src") src_via_js = browser.execute_script('return arguments[0].src;', target_video) print("直接获取的src:", src_direct) print("通过JS获取的src:", src_via_js) browser.quit()
关键说明
- 精确定位:使用你在Safari中确认的XPath定位元素,避免误选其他video标签。
- JavaScript读取:对于动态加载的属性,通过
execute_script直接读取DOM元素的src属性,通常能获取到动态更新后的真实值,解决get_attribute返回空的问题。
内容的提问来源于stack exchange,提问作者BlueGreenWhyteRed
相关产品推荐
相关产品推荐

