Python + Selenium有效地获取列表中元素的属性

Gor*_*vic 2 python selenium phantomjs selenium-webdriver

使用Python,Selenium和PhantomJS获取多个元素的相同属性的最有效方法是什么?我的解决方案使用find_elements_by_css_selector哪个定位我需要的所有元素,这需要不到一秒钟,然后我循环遍历列表以获取我需要的属性.我的循环花费了大约2500个元素的一分钟,考虑到所有元素都是用find_elements_by_css_selector方法映射的,这对我来说似乎很多.是get_attribute方法真的那么贵还是我做错了什么?

from selenium import webdriver

driver = webdriver.PhantomJS(executable_path=r'mypath\phantomjs.exe')
driver.set_window_size(1120, 550)
driver.get("https://www.something.com")

table = []
elements = driver.find_elements_by_css_selector("tr[id*='bet-']") # takes under 1 second

for element in elements:
   table.append(element.get_attribute('data-info')) # takes over 60 seconds (2000 elements)

driver.close
Run Code Online (Sandbox Code Playgroud)

ale*_*cxe 5

问题是,每个.get_attribute()selenium命令都是JSON HTTP连接请求,当然,它会引入很多开销.

没有直接的方法可以为多个元素执行"批量获取属性".

你可能做的最接近的事情是通过JavaScript获取属性,发布execute_script(),这是一个单一的JSON HTTP命令:

attributes = driver.execute_script("""
    var result = []; 
    var all = document.querySelectorAll("tr[id*='bet-']"); 
    for (var i=0, max=all.length; i < max; i++) { 
        result.push(all[i].getAttribute('data-info')); 
    } 
    return result;
""")
Run Code Online (Sandbox Code Playgroud)

这种方法的一个缺点是,在这种情况下,元素属性检索逻辑不是基于webdriver API规范 - 如果您在代码库中遵循基于selenium和js的方法,这可能会导致结果不一致.

一些相关主题: