【问题标题】:Ruby Mechanize table scraping doesn't capture entire rowRuby Mechanize 表抓取不会捕获整行
【发布时间】:2011-02-17 00:11:33
【问题描述】:

我正在尝试使用 mechanize 抓取一个表格网站。 我想刮第二行。

当我跑步时:

agent.page.search('table.ea').search('tr')[-2].search('td').map{ |n| n.text }

我希望它会刮掉整行。但它只会刮掉:[“2011-02-17”,“0,00”]

为什么不抓取行中的所有列,而只抓取第一列和最后一列?

Xpath: /html/body/center/table/tbody/tr[2]/td[2]/table/tbody/tr[3]/td/table/tbody/tr[2]/td/table/tbody/tr[2 ]

CSS 路径: html body center table tbody tr td table tbody tr td table tbody tr td table.ea tbody tr td.total

页面类似这样:

<table><table><table>
<table width="100%" border="0" cellpadding="0" cellspacing="1" class="ea">
<tr>
    <th><a href="#">Date</a></th>
    <th><a href="#">One</a></th>    
    <th><a href="#">Two</a></th>    
    <th><a href="#">Three</a></th>     
    <th><a href="#">Four</a></th>    
    <th><a href="#">Five</a></th>        
    <th><a href="#">Six</a></th>        
    <th><a href="#">Seven</a></th>      
    <th><a href="#">Eight</a></th>
</tr>
<tr>
    <td><a href="#">2011-02-17</a></td>
    <td align="right">0</td>    
    <td align="right">0</td>    
    <td align="right">0,00</td>     
    <td align="right">0</td>    
    <td align="right">0</td>        
    <td align="right">0</td>    
    <td align="right">0</td>        
    <td align="right">387</td>      
    <td align="right">0,00</td>     <!-- FOV -->
    <td align="right">0,00</td>
</tr>
<tr>
    <td class="total">Ialt</td>
    <td class="total" align="right">0</td>  
    <td class="total" align="right">40</td>     
    <td class="total" align="right">0,46</td>   
    <td class="total" align="right">2</td>      
    <td class="total" align="right">0</td>        
    <td class="total" align="right">0</td>      
    <td class="total" align="right">0</td>        
    <td class="total" align="right">3.060</td>      
    <td class="total" align="right">0,00</td>       
    <td class="total" align="right">18,58</td>
</tr>
</table>
</table></table></table>

【问题讨论】:

  • 我发现页面没有列。因此,而不是提交表单。我确实使用 URL 来访问正确的列。

标签: ruby-on-rails ruby-on-rails-3 nokogiri hpricot mechanize-ruby


【解决方案1】:

使用以下 Ruby 代码 (https://gist.github.com/835603):

require 'mechanize'
require 'pp'

a = Mechanize.new { |agent|
  agent.user_agent_alias = 'Mac Safari'
}

a.get('http://binarymuse.net/table.html') do |page|
  pp page.search('table.ea').search('tr')[-2].search('td').map{ |n| n.text }
end

我得到以下输出:

["2011-02-17", "0", "0", "0,00", "0", "0", "0", "0", "387", "0,00", "0,00"]

【讨论】:

  • pp 在需要时变为 false
  • 您在使用 Rails 应用程序吗?无论如何,pp 只是Ruby Pretty Print library;没有必要让示例正常工作。只需删除 require 并将对 pp page... 的调用替换为 puts page... 我的意思是我的输出与基于您的问题的预期输出不匹配。
  • 我在 Rails 应用程序中。我发现该页面没有列。因此,而不是提交表单。我确实使用 URL 来访问正确的列。
【解决方案2】:

我建议您将 Mechanize 留给比抓取页面更难的事情。 你可以使用Nokogiri 比使用 Mechanize 简单得多(当然你也可以使用它),因为你可以只使用query 页面。

试试看!

here 是关于 nokogiri 的答案的链接

当我需要发送表单和类似的东西时,我个人会使用 Mechanize尽管它还有很多其他用途!

【讨论】:

  • Mechanize 内部实际上使用了 Nokogiri,您可以通过调用 root() (gist.github.com/844178) 来检索 Nokogiri::HTML::Document 实例
  • 我不知道,:) 但是如果你可以用 Nokogiri/Whatever gem theres 的话,使用 Mechanize 进行刮擦没有任何意义。至少从问题状态来看,我认为使用 mechanize 毫无意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多