以下内容有效,但总是很慢,似乎使我的抓取程序及其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包含文件中尝试。