2

以下面的 html 为例。它是我用来练习的草稿纸,但它有一个我正在尝试使用的真实 html 的片段。

http://www.carbide-red.com/prog/test_table.html

我试图找到一列,我能找到的唯一一致的标识符是背景颜色(bgcolor)。

<tr bgcolor="#ffffcc">
    <td bgcolor="yellow" class="date" align=center>Equipment</td>
    <td bgcolor="#ccccff" align=center class="date"><font color=black>8/12/12</font></td>
    <td bgcolor="#ccccff" align=center class="date"><font color=black>8/19/12</font></td>
    <td bgcolor="#ccccff" align=center class="date"><font color=black>8/26/12</font></td>
    <td bgcolor="#ccccff" align=center class="date"><font color=black>9/2/12</font></td>
    <td bgcolor="red" align=center class="date"><font color=yellow>9/9/12</font></td>
    <td bgcolor="#ccffcc" align=center class="date"><font color=black>9/16/12</font></td>
    <td bgcolor="#ccffcc" align=center class="date"><font color=black>9/23/12</font></td>
    <td bgcolor="#ccffcc" align=center class="date"><font color=black>9/30/12</font></td>
    <td bgcolor="#ccffcc" align=center class="date"><font color=black>10/7/12</font></td>
</tr>

我正在尝试找到<td>具有 bgcolor=red 的那个。然后我想保存该单元格的列索引,以便我可以使用它来选择以下行的同一列。

但我似乎找不到搜索bgcolor=标签的方法。而且我还没有找到一种方法让 Watir 报告列/行索引以存储在变量中。但是如果我能找到bgcolor=标签,那么我可以搜索“设备”,然后计数,直到找到正确的标签。

我知道 html 代码并不理想,因为有任何“名称”或任何唯一标识符,但我无法更改。

我对 Ruby 和 Watir 很陌生。我试图在 Perl 中操作一个网站,但进展并不顺利,我发现了 Watir,它完全符合我的需要(而且非常简单),但现在我试图理解 Ruby 以及更精细的语义。

谢谢你的帮助!

4

3 回答 3

1

如果我是你,我会使用 nokogiri:

doc = Nokogiri::HTML @browser.html
td = doc.at('td[@bgcolor="red"]')
index = td.search('./preceding-sibling::td').length

除非页面上有棘手的 javascript,否则使用 mechanize 可能比 watir 更好。

于 2012-09-10T04:11:53.920 回答
1

要获取文本,<td bgcolor="red">请尝试以下操作:

browser.element(:css => "td[bgcolor=red]").text

你应该回来"9/9/12"。要单击元素,请替换textclick

要将其索引放入变量中,请index尝试以下操作:

index = nil
browser.tds.each_with_index {|td, i| index = i if td.attribute_value("bgcolor") == "red" or td.attribute_value("bgcolor") == "#ff0000"}

index变量应该是5.

于 2012-09-10T12:07:24.540 回答
0

是的,我正在处理的网页使用 Javascript,这就是为什么我很难在 Perl 下使用 Mechanize::Firefox。Watir 的工作更加顺利。

谢谢您的建议!起初它不起作用,但它帮助我进行了 Google 搜索,并且我能够获得一个工作版本。

require "watir"
require "nokogiri"

browser = Watir::Browser.new
browser.goto "http://www.carbide-red.com/prog/test_table.html"

doc = Nokogiri::HTML.parse(browser.html) 
td = doc.at('td[@bgcolor="red"]') 
columnindex = td.search('./preceding-sibling::td').length 

puts columnindex
browser.close

这返回了“5”

更新:

为了其他人在搜索和学习时可能会发现这一点。要使用columnindex变量在行中查找特定列,请使用以下代码:

textvariable = browser.td(:text => "A58004").parent.td(:index => "#{columnindex}").text
puts "Textvariable: #{textvariable}"

这会找到<td>包含术语“A58004”的 a,然后转到第 5 列 (0-5) 并返回该单元格的值。使用我原始问题中链接的网页,即“W = Sa”

于 2012-09-10T13:20:35.797 回答