2017-10-17 139 views
0

我试图将webelement内容存储到python列表中。当它工作时,处理约2,000行需要约15分钟。Selenium WebDriver将WebElement数据添加到列表的速度很慢

# Grab webelements via xpath 
rowt = driver.find_elements_by_xpath("//tbody[@class='table-body']/tr/th[@class='listing-title']") 
rowl = driver.find_elements_by_xpath("//tbody[@class='table-body']/tr/td[@class='listing-location']") 
rowli = driver.find_elements_by_xpath("//tbody[@class='table-body']/tr/th/a") 

title = [] 
location = [] 
link = [] 

# Add webElement strings to lists 
print('Compiling list...') 
[title.append(i.text) for i in rowt] 
[location.append(i.text) for i in rowl] 
[link.append(i.get_attribute('href')) for i in rowli] 

有没有更快的方法来做到这一点?

+0

一种方法是发送一些JavaScript浏览器端来从表中提取数据。 Java webdriver绑定提供了一个多功能的'executeJavascript'方法https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/remote/RemoteWebDriver.html#executeScript-java.lang.String-java .lang.Object ...-可以让你做到这一点。下面是一个示例https://medium.com/@danidiaz/extracting-the-contents-of-a-table-in-selenium-ba69b2ca80a9 Python中的相应函数似乎是'execute_script(script,* args)',但它是从文档中不清楚结果是如何反序列化的。 – danidiaz

+0

Python中浏览器的Javascript注入示例:https://johnpauljanecek.github.io/using-javascript-with-python-selenium/ – danidiaz

+0

您可以分享该网站吗?我会有兴趣尝试一些事情。 – JeffC

回答

0

建议(道歉,如果它没有帮助):

  1. 我觉得熊猫可以用来直接加载HTML表格。如果你的意图是刮一张桌子,那么像Bs4这样的图书馆也可能会派上用场。
  2. 您可以存储整个HTML并使用正则表达式解析它,导致您提取的所有数据将被包含在一组固定的HTML标记中。
+0

我会使用bs4,但网站是动态加载的javascript :( 我会尝试正则表达式的方法,看看它是否提高性能。谢谢! – tkim90

0

您的解决方案是通过表格解析三次,一次是标题,一次是位置,一次是链接。

尝试仅解析表格一次。为该行选择一个选择器,然后遍历行,并为每一行使用相对路径提取3个元素。您的链接,它应该是这样的:

link.append(row.find_elements_by_xpath("./th/a").get_attribute('href')) 
+0

这真的没有显着不同于OP已经在做什么。在你的循环中再次抓取页面,你只是从现有元素开始 – JeffC

+0

我承认我没有做任何计时,这只是我从经验中得出的直觉,这对Selenium来说需要更短的时间。 –

0

取决于你想要做什么,如果是呈现页面的服务器有一个API,它很可能是显著快为你使用来检索数据,而不是从页面上抓取内容。

您可以使用浏览器工具查看不同请求发送到服务器的情况,也许数据以JSON格式返回,您可以轻松地从中检索数据。

这当然假设您对数据感兴趣,而不是直接验证页面内容。

0

我猜最慢的是[location.append(i.text) for i in rowl]
当您致电i.text时,Selenium需要确定将在该元素中显示的内容,因此需要更多时间来处理。
您可以使用替代方法i.get_attribute('innerText')

[location.append(i.get_attribbute('innerText')) for i in rowl] 

但是,我不能保证结果是一样的。 (它应该与.Text相同或相似)。

我已经在我的机器上测试了〜2000行,i.text需要80秒。而i.get_attribute('innerText')需要28秒。