Selenium获取script标签src属性时仅返回完整URL,无法捕获相对路径URL的解决方法
Selenium获取script标签src属性时仅返回完整URL,无法捕获相对路径URL的解决方法
我完全懂你的困扰——你想抓取HTML源码里原本的相对路径src(比如/cdn/script.js),但用Selenium的get_attribute("src")拿到的总是浏览器解析后的完整URL,导致代码里判断相对路径的逻辑根本触发不了,对吧?
问题根源
Selenium的get_attribute("src")方法默认会返回浏览器解析后的绝对URL,而不是HTML里写的原始属性值。举个例子:哪怕HTML里的script标签写的是<script src="/cdn/script.js"></script>,用这个方法拿到的也是https://example.com/cdn/script.js,自然匹配不上你代码里的startswith("/")判断。
解决方法:获取原始属性值
要拿到HTML里的原始路径,我们可以直接调用浏览器的JavaScript来获取属性的原始值,绕过Selenium的自动解析。具体来说,用execute_script执行JS代码,获取元素的getAttributeNode("src").value:
修改后的代码示例
def GetScriptArray(): ScriptArray = [] # 建议在函数内初始化数组,避免全局变量冲突 ScriptElements = Driver.find_elements(By.TAG_NAME, 'script') for x, Script in enumerate(ScriptElements, start=1): # 通过JS获取原始src属性值,不经过Selenium的URL解析 ScriptSource = Driver.execute_script('return arguments[0].getAttributeNode("src")?.value;', Script) ScriptSourceAlt = Driver.execute_script('return arguments[0].getAttributeNode("data-original-src")?.value;', Script) if ScriptSource: if ScriptSource.startswith("http"): ScriptArray.append(ScriptSource) elif ScriptSource.startswith("//"): print(f"SPECIAL 1 : {ScriptSource}") ScriptArray.append(ScriptSource) # 按需决定是否加入数组 elif ScriptSource.startswith("/"): print(f"SPECIAL 2 : {ScriptSource}") ScriptArray.append(ScriptSource) # 把相对路径加入结果数组 else: print(f"SCRIPT NUM {x} HAS NO SRC") return ScriptArray # 返回收集到的所有src
关键修改点说明
- 替换属性获取方式:用
execute_script调用JS的getAttributeNode("src").value,直接拿到HTML里的原始路径,不管是绝对路径、相对路径还是//开头的协议相对路径。 - 完善数组收集逻辑:原来的代码只收集了http开头的URL,现在可以根据需求把相对路径和
//开头的路径也加入数组。 - 代码优化:用f-string简化打印语句,函数内初始化数组避免全局变量问题。
这样修改后,你就能捕获到所有类型的src路径,包括你想要的/cdn/script.js这类相对路径了。
备注:内容来源于stack exchange,提问作者B Z
相关产品推荐
相关产品推荐

