使用 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
最佳答案
问题是,每个 .get_attribute()
selenium 命令都是一个 JSON HTTP wire request而且,它当然会带来很多开销。
没有直接的方法对多个元素进行“批量获取属性”。
您可能做的最接近的事情是通过 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;
""")
这种方法的一个缺点是在这种情况下元素属性检索逻辑不是基于 webdriver API specification - 如果您在代码库中同时遵循基于 selenium 和基于 js 的方法,这可能会导致结果不一致。
一些相关主题:
关于Python + Selenium 有效获取列表中元素的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43047606/