Selenium中find_elements如何高效批量获取元素innerHTML属性
问题根因
find_elements()返回值是WebElement组成的Python列表,列表对象本身没有get_attribute()方法,直接链式调用必然报错。只有单个WebElement实例可以调用get_attribute()、.text这类属性和方法。- 逐元素遍历取值慢的核心原因:每一次读取元素属性、文本的操作,都会单独发起一次Selenium客户端到浏览器驱动的HTTP请求,260个元素对应260次独立IO请求,耗时全在网络通信上,和Python循环本身的性能没有关系。
最高效实现方案
直接通过execute_script注入原生JavaScript,在浏览器进程内一次性完成元素匹配、内容提取的全流程,全程仅产生1次客户端到驱动的通信,性能和直接调用find_elements()拉取元素引用基本持平,比逐元素遍历快3个数量级左右。
代码实现:
target_class_name = "roulette-history-item__value-textsiwxWvFlm3ohr_UMS23f" # 提取元素可见文本,需要innerHTML的话把下方的textContent替换成innerHTML即可 values = driver.execute_script(""" const nodeList = document.getElementsByClassName(arguments[0]); return Array.from(nodeList).map(item => item.textContent.trim()); """, target_class_name)
使用说明
- 代码直接在浏览器DOM侧匹配目标元素,不需要提前调用
find_elements拉取元素引用,额外开销为0 - 如果需要获取元素内部HTML,仅需将回调里的
item.textContent.trim()替换为item.innerHTML即可 - 返回结果直接是和元素顺序一一对应的文本/属性值列表,不需要额外做二次处理
避坑提示:不要采用「先find_elements拿元素列表,再循环把元素传入execute_script取值」的写法,这种写法依然会产生多次跨进程通信,性能提升非常有限。
内容的提问来源于stack exchange,提问作者Gustavo Araújo
相关产品推荐
相关产品推荐

