使用Watir <table> </table>将整个html导出到文本文档

时间:2011-12-02 11:27:50

标签: ruby automation watir watir-webdriver browser-automation

基本上我想做的就是将整个html表导出到.txt文件(记事本文档)。

到目前为止,我已经学会了如何指示浏览器找到带有表格的html页面。

require 'rubygems' 
require 'hpricot' 
require "watir-webdriver" 
url = "http://www.example.com"
browser = Watir::Browser.new 
browser.goto url

在cmd中运行上面的内容后,我现在可以在浏览器中看到html表了。

这是我被困的地方。我如何使用Watir

  1. 找到标签
  2. 收集其中的所有内容(即html和文本)。
  3. 将这些结果解压缩到.txt文件(记事本文档)并将其保存在特定文件夹中。
  4. 仅供参考,html表格如此......

    <table border="1" cellpadding="2">
    <tr>
    <th> Address </th>
    <th> Council tax band </th>
    <th> Annual council tax </th>
    </tr>
    
    <tr>
    <td> 2, STONELEIGH AVENUE, COVENTRY, CV5 6BZ </td>
    <td align="center"> F </td>
    <td align="center"> &pound;2125 </td>
    </tr>
    

    .......以上行重复多次......

    </table> 
    

    然后桌子关闭了。

    重新限制我的情况。我可以使用Watir将浏览器导航到包含html表的页面,但我的问题是我不确定如何将结果(标记内的所有内容 - 包括html)提取到.txt文件,然后保存.txt存档到我的电脑上。

    我更愿意使用Watir采取更小的步骤。我知道它因此我只想学习如何提取表并将我提取的所有内容保存到.txt文件中。我在网上看过几个使用hpricot的例子。但是,大多数示例似乎都错过了详细说明如何将数组(如果这是正确的方法)输出到.txt文件中的代码。

    您可以通过演示如何编写一段简单的代码来提供帮助,这些代码将html表(以及其中的所有内容,包括其中的所有内容)解压缩到.txt记事本文件中吗?

    非常感谢你的时间。

2 个答案:

答案 0 :(得分:3)

获取整个表的HTML(如果它是页面上唯一的表):

browser.table.html

你会得到这样的东西:

=> "<table border=\"1\" cellpadding=\"2\">\n<tbody><tr>\n<th> Address </th>\n<th> Council tax band </th>\n<th> Annual council tax </th>\n</tr>\n\n<tr>\n<td> 2, STONELEIGH AVENUE, COVENTRY, CV5 6BZ </td>\n<td align=\"center\"> F </td>\n<td align=\"center\"> £2125 </td>\n</tr>\n\n</tbody></table>"

获取每行的HTML并将其放入数组中:

browser.table.trs.collect {|tr| tr.html}

=> ["<tr>\n<th> Address </th>\n<th> Council tax band </th>\n<th> Annual council tax </th>\n</tr>",
    "<tr>\n<td> 2, STONELEIGH AVENUE, COVENTRY, CV5 6BZ </td>\n<td align=\"center\"> F </td>\n<td align=\"center\"> £2125 </td>\n</tr>"] 

获取每个单元格的文本并将其放入数组中:

browser.table.trs.collect {|tr| [tr[0].text, tr[1].text, tr[2].text]}
=> [["Address", "Council tax band", "Annual council tax"],
    ["2, STONELEIGH AVENUE, COVENTRY, CV5 6BZ", "F", "£2125"]] 

将每个单元格的文本写入文件:

content = b.table.trs.collect {|tr| [tr[0].text, tr[1].text, tr[2].text]}
File.open("table.txt", "w") {|file| file.puts content}

该文件如下所示:

Address
Council tax band
Annual council tax
2, STONELEIGH AVENUE, COVENTRY, CV5 6BZ
F
£2125

答案 1 :(得分:2)

有很多方法可以解决这个问题,如果我们对你特别想要完成的事情有更多的了解,那么我们可以给你一些更具体的答案,而不是一般的答案。

如果要将内容转换为数组,可以使用.collect作为Zeljko显示的内容。如果您只想处理数据或迭代表格中的行和单元格,那么.each.each_with_index可能就是您想要的。

我怀疑你真的想要表格中的文字,而不是HTML。所以这里有一些尝试(未经测试,但它应该工作)

browser.table(:how => what).rows.each_with_index do |row, r|
  row.cells.each_with_index do |cell, c|
    puts "Row:#{r} Cell:#{c} text is: #{cell.text}"
  end
end

如果上面的.rows.cells不起作用(未知方法),请尝试替换.trs.tds分别(并非所有版本的watir都有友好 这些方法的别名)

看看是否会吐出您感兴趣的内容。如果是这样,您应该能够轻松修改以将您想要的内容写入文件而不是将其放到屏幕上。

但是,如果验证是您的目标,那么让自动化代码在数据库中查找并为您进行比较可能更容易。