watir表对象处理的性能问题。如何使Nokogiri html表成阵列?

时间:2012-05-17 10:28:27

标签: ruby nokogiri watir watir-webdriver

以下有效,但总是非常缓慢,似乎停止了我的抓取程序及其Firefox或Chrome浏览器整整几分钟每页

pp recArray = $browser.table(:id,"recordTable").to_a

获取HTML表格的文本或html源代码的速度很快:

htmlcode = $browser.table(:id,"recordTable").html  # .text shows only plaintext portion like lynx

我如何能够使用例如仅保存该表的html的Nokogiri对象来创建相同的 recArray (来自<TR>的每个元素)?

recArray = Nokogiri::HTML(htmlcode). ??

3 个答案:

答案 0 :(得分:4)

几天前我写了一篇关于这篇文章的博文:http://zeljkofilipin.com/watir-nokogiri/

如果您还有其他问题,请询问。

答案 1 :(得分:2)

你想要表中的每个tr吗?

Nokogiri::HTML($browser.html).css('table[@id="recordTable"] > tr')

这给出了一个比Array更有用的NodeSet。当然还有to_a

答案 2 :(得分:1)

认为总结这里和那里的所有步骤是有用的:

问题是如何使用 Watir :: Webdriver Table #to_a 可能产生的页面文本内容来生成填充字符串的相同数组对象,但速度要快得多:

 recArray = Nokogiri::HTML(htmlcode). **??**

所以不要像我以前那样做:

  recArray=$browser.table(:class, 'detail-table w-Positions').to_a

我将整个页面的html作为字符串发送给Nokogiri,让它进行解析:

  recArray=Nokogiri::HTML($browser.html).css('table[@class="detail-table w-Positions"] tr').to_a 

找到了我想要的表格的行并将它们放入数组中。

还没有完成,因为该数组的元素仍然是Nokogiri(表行?)类型,当我尝试像.join(",")这样的事情时这会被禁止(例如,用于写入.CSV文件或数据库)

所以下面遍历每个row元素,将每个元素转换为纯Ruby String类型的数组,只包含每个表单元格的文本内容,这些文本内容都被剥去了html标签:

 recArray= recArray.map {|row| row.css("td").map {|c| c.text}.to_a }  # Could of course be merged with above to even longer, nastier one-liner

每个单元格之前也是Nokogiri元素类型,不再使用.text映射。

实现了显着的加速。

接下来我想知道如何在我的Ruby代码文件中全局覆盖每个 Watir :: Webdriver Table 对象的#to_a方法....

(我意识到这可能不是100%兼容,但它会让我无法重写代码。我愿意尝试使用 personal.lib.rb 包含文件。)