【问题标题】:Grabbing and/or Parsing HTML Traffic in Ruby with Watir?使用 Watir 在 Ruby 中抓取和/或解析 HTML 流量?
【发布时间】:2013-10-09 23:34:46
【问题描述】:

在使用 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”的标签,并将那段代码保存到一个字符串中(包括标签)?

【问题讨论】:

    标签: html css ruby mechanize watir


    【解决方案1】:

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

    假设解释正确,您可以执行以下操作。请注意,您可以在任何 Watir 元素上使用 .html 方法来获取其 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>"]
    

    【讨论】:

    • 完美。又来救人了。你已经把它记下来了,谢谢!
    【解决方案2】:

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

    my_html_container = @browser.html
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 2016-07-03
      • 2011-04-23
      • 1970-01-01
      • 2010-12-05
      相关资源
      最近更新 更多