0

在使用 Watir 和 Mechanize 解析自动化浏览器时,我遇到了一段数据,我希望能够从一个页面(以及来自其他页面的类似数据)中提取这些数据,如下所示:

<data>
<somehtmltags>
<tr style="cursor:auto"><td class="hyperlink-first" style="padding-top:20px">Title1</td><td style="padding-top:20px">Data: <br/>Data2: <br/>Data3: <br/>Data4: <br/></td><td style="text-align:center;"><img alt="SomeData" border="0" height="100" src="servlet/Chart?filename=jfreechart-onetime-tmp.png" style="position:static" width="580"/></td></tr>
<tr style="cursor:auto"><td class="hyperlink-first" style="padding-top:20px">Title2</td><td style="padding-top:20px">Data: <br/>Data2: <br/>Data3: <br/>Data4: <br/></td><td style="text-align:center;"><img alt="SomeData" border="0" height="100" src="servlet/Chart?filename=jfreechart-onetime-tmp.png" style="position:static" width="580"/></td></tr>
<somemorehtmltags>
<more data>

我的问题是,在 Ruby 中使用 Watir、Mechanize、Nokogiri 或类似方法 - 有没有更简单的方法可以指定我想要在我的 HTML 代码中使用一组特定的匹配标签并将其保存在其他地方?

所以在这个例子中,我想搜索一组标题为“Title1”的标签并将那段代码保存到一个字符串(包括标签)?

4

2 回答 2

3

我对您的问题的解释是,您希望单元格(td 元素)的 html 与带有文本“Title1”的单元格(td 元素)相邻。在您的示例代码中,这意味着第一个 tr 元素中的第二个 td 元素。

假设解释正确,您可以执行以下操作。请注意,您可以.html在任何 Watir 元素上使用该方法来获取其 html(作为可以保存到变量的字符串)。

#Find the cell with Title1 and then get the second cell in that row
html = browser.td(:text => 'Title1').parent.td(:index => 1).html
#=> "<td style=\"padding-top:20px\">Data: <br>Data2: <br>Data3: <br>Data4: <br></td>"

如果你想要整行,包括标题,你可以得到 Title1 元素的父元素:

html = browser.td(:text => 'Title1').parent.html
#=> "<tr style=\"cursor:auto\"><td class=\"hyperlink-first\" style=\"padding-top:20px\">Title1</td><td style=\"padding-top:20px\">Data: <br>Data2: <br>Data3: <br>Data4: <br></td><td style=\"text-align:center;\"><img alt=\"SomeData\" src=\"servlet/Chart?filename=jfreechart-onetime-tmp.png\" style=\"position:static\" border=\"0\" height=\"100\" width=\"580\"></td></tr>"

以上假设您要获取的页面上只有 1 个 Title1 元素。如果可能有多个,那么您将需要创建一个包含文本 Title1 的 td 元素的集合,然后为每个元素收集兄弟元素。这将为您提供一个字符串数组。

html = browser.tds(:text => 'Title1').collect do |td| 
    td.parent.td(:index => 1).html
end
#=> ["<td style=\"padding-top:20px\">Data: <br>Data2: <br>Data3: <br>Data4: <br></td>", 
#=> "<td style=\"padding-top:20px\">Data: <br>Data2: <br>Data3: <br>Data4: <br></td>"]

如果 Jano 的解释是正确的,并且您想要标题类似于“Title”的所有行(即“Title1”、“Title2”等),则可以使用正则表达式进行部分文本匹配。以下将为您提供第一个单元格类似于标题的每一行。

html = browser.tds(:text => /^Title\d$/).collect do |td| 
    td.parent.html
end
#=> ["<tr style=\"cursor:auto\"><td class=\"hyperlink-first\" style=\"padding-top:20px\">Title1</td><td style=\"padding-top:20px\">Data: <br>Data2: <br>Data3: <br>Data4: <br></td><td style=\"text-align:center;\"><img alt=\"SomeData\" src=\"servlet/Chart?filename=jfreechart-onetime-tmp.png\" style=\"position:static\" border=\"0\" height=\"100\" width=\"580\"></td></tr>",
#=> "<tr style=\"cursor:auto\"><td class=\"hyperlink-first\" style=\"padding-top:20px\">Title2</td><td style=\"padding-top:20px\">Data: <br>Data2: <br>Data3: <br>Data4: <br></td><td style=\"text-align:center;\"><img alt=\"SomeData\" src=\"servlet/Chart?filename=jfreechart-onetime-tmp.png\" style=\"position:static\" border=\"0\" height=\"100\" width=\"580\"></td></tr>"]
于 2013-10-10T10:54:11.233 回答
0

使用 ruby​​ 和 watir,您可以使用正则表达式在 html 中搜索您的标签。在您的情况下,您可以使用以下内容获取 html 页面:

my_html_container = @browser.html

...并使用正则表达式和扫描功能来获取标签,例如:

my_tags = my_html_container.scan(/(<tr .*)Title\d(.*tr>)/)

您可以修改正则表达式以获得您想要的内容:)

于 2013-10-10T08:47:31.060 回答