Watir 表对象处理的性能问题.如何将Nokogiri html表制作成数组



以下内容有效,但总是很慢,似乎使我的抓取程序及其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

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

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

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

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

你想要表中的每个 tr?

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

这给出了一个比数组更有用的节点集。当然还有to_a

认为总结

这里和那里的所有步骤会很有用:

问题是如何生成相同的数组对象,该对象填充了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 文件或数据库(

因此,下面遍历每个行元素,将每个行元素转换为纯 Ruby 字符串类型的数组,仅包含去除 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% 兼容的,但它会让我省去这么多代码重写。我愿意在我的个人.lib.rb包含文件中尝试。

相关内容

  • 没有找到相关文章

最新更新