Python使用Selenium如何获取::before/::after伪元素中的链接
问题核心原因
::before、::after是CSS渲染生成的伪元素,不属于真实DOM树,Selenium原生定位方法无法直接选中这类节点。你无法直接拿到链接的本质是:关联的跳转地址要么存储在伪元素对应的宿主DOM元素的CSS content 属性中,要么硬编码在元素绑定的JS点击事件回调里,完全不需要通过点击打开新窗口的方式提取。
高效提取方案
方案1:读取CSS计算样式提取链接(适配绝大多数伪元素挂链接的场景)
这类和伪元素绑定的链接,绝大多数都会直接写在对应伪元素的content样式值里,通过Selenium调用JS直接读取计算后的样式即可,全程不需要触发点击、不需要加载新页面:
from selenium import webdriver import re driver = webdriver.Chrome() # 加载目标页面逻辑自行补充 # driver.get(目标页地址) # 替换为你需要提取的目标元素对应的CSS选择器 target_elems = driver.find_elements("css selector", ".替换为你的目标元素class") for elem in target_elems: # 读取::before伪元素的content值,如果是::after关联链接就把参数换成'::after' raw_content = driver.execute_script(""" const pseudoProp = window.getComputedStyle(arguments[0], '::before').getPropertyValue('content'); return pseudoProp; """, elem) # 去掉content值默认包裹的单/双引号,就是最终的链接 link = re.sub(r"^['\"]|['\"]$", "", raw_content) print(link)
提示:如果确认链接是绑定在::after伪元素上,只需要把JS代码里的'::before'修改为'::after'即可
方案2:提取元素点击事件里硬编码的链接
如果读取到的content值不是链接,说明跳转地址写在元素绑定的点击事件里,直接解析事件属性即可:
for elem in target_elems: onclick_str = elem.get_attribute("onclick") if not onclick_str: continue # 从onclick字符串里匹配跳转链接 link_match = re.search(r"(window.open|location.href)\s*\(\s*['\"]([^'\"]+)['\"]", onclick_str) if link_match: link = link_match.group(2) print(link)
效率说明
- 原点击开新窗口提取的方案:单条链接需要等待新页面加载、切换窗口句柄、关闭新页、切回原页,单条耗时2-5秒,页面链接多的时候耗时会非常长
- 上述JS直读方案:单条链接提取耗时在毫秒级,不需要加载任何额外资源,提取效率可以提升上百倍
避坑提醒:不要尝试用Selenium原生的find_element类方法直接定位伪元素,伪元素不在DOM结构中,所有原生定位方法都无法命中这类节点,必须通过JS读取计算样式或者事件属性取值。
内容的提问来源于stack exchange,提问作者DumbCoder
相关产品推荐
相关产品推荐

