我如何在我的Rails应用程序中将Watir从此表中的值中删除为实例变量?

时间:2017-07-24 14:23:03

标签: ruby web-scraping watir

这是我的表格:

<tbody><tr>
                  <td class="rhs">Number:</td>
                  <td id="number"><strong>2</strong></td>
       </tr>
       <tr>
                  <td class="rhs">Total:</td>
                  <td id="total"><strong>£60,000</strong></td>           
       </tr>
       <tr>
                  <td class="rhs">GrandTotal</td>
                  <td><strong>£200,000</strong></td>           
       </tr>
       <tr>
                  <td class="rhs">Limit:</td>
                  <td><strong>£550,000</strong></td>         
       </tr>
       <tr>
                  <td class="rhs">Frequency:</td>
                  <td><strong>Annually</strong></td>
       </tr>
       <tr>
                       <td class="rhs">Percentage:</td>
                       <td><strong>0%</strong></td>
       </tr>
       <tr class="display-total">
                      <td class="rhs">Year 1:</td>
                      <td><strong>£480.00</strong></td>
       </tr>        
</tbody></table>

我正在和Watir一起努力去刮擦&#39;值并将它们存储在我的应用程序中的变量中。

def scrape_quote
        puts @quote.number = @browser.td(:id, 'number').text
        @quote.total = @browser.td(:id, 'total').text
        @quote.grand_total= @browser.tr(:index => '3').td(:index => '1').text
        @quote.limit = @browser.tr(:index => '4').td(:index => '1').text
        @quote.frequency = @browser.tr(:index => '5').td(:index => '1').text
        @quote.percentage = @browser.tr(:index => '6').td(:index => '1').text
        @quote.yr1 = @browser.tr(:index => '7').td(:index => '1').text

        puts @quote.number + ' ' +  @quote.total  + ' ' +  @quote.grand_total
         + ' ' + @quote.limit + ' ' +  @quote.frequency + ' ' +  @quote.commission
          + ' ' +  @quote.yr1
end

(只是看看方法是否有效,一旦工作,我实际上将它们保存在模型中。)

不幸的是,上述内容并未按预期捕获和/或存储这些值。你能帮我看看我的方式错误吗?

三江源。

2 个答案:

答案 0 :(得分:0)

您尝试使用String作为索引值来访问值,该值应为整数。在任何情况下,最终代码应如下所示:

 rows = @b.trs #Retrieve all trs
scraped_values = {} #Creating a dictionary to store scraped values

for row in rows #iterate over trs
  scraped_values[row[1].id] = row[1].text #retrieve the data
end
puts scraped_values

答案 1 :(得分:0)

在watir中,将s放在元素标记后获取具有该标记的所有元素并将其放在数组上。

因此,在您的情况下,如果您输入命令@browser.trs.length,则值将为7,因为您的表中有7行。

至于id,我总是使用@browser.td(:id=>'id')并且它始终有效,尽管@browser.td(:id, 'id')也适用于我。

def scrape_quote
        puts @quote.number = @browser.td(:id=>'number').text
        @quote.total = @browser.td(:id=>'total').text
        @quote.grand_total= @browser.trs[3].tds[1].text
        @quote.limit = @browser.trs[4].tds[1].text
        @quote.frequency = @browser.trs[5].tds[1].text
        @quote.percentage = @browser.trs[6].tds[1].text
        @quote.yr1 = @browser.trs[7].tds[1].text

        puts @quote.number + ' ' +  @quote.total  + ' ' +  @quote.grand_total
         + ' ' + @quote.limit + ' ' +  @quote.frequency + ' ' +  @quote.commission
          + ' ' +  @quote.yr1
end