以下有效,但总是非常缓慢,似乎停止了我的抓取程序及其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).
??
答案 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 包含文件。)