2013-10-16 64 views
0

我試圖複製使用引入nokogiri一個NBA聯賽表的內容,但有一個小麻煩:刮屏幕?

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 

url = "http://www.nba.com/standings/team_record_comparison/conferenceNew_Std_Cnf.html" 
doc = Nokogiri::HTML(open(url)) 
doc.css(":contains('Western Conference')").count do |team| 
    puts team .at_css("") 
end 

我特林從http://www.nba.com/standings/team_record_comparison/conferenceNew_Std_Cnf.html和 得到表只想西會議桌,但可以似乎沒有得到它。

回答

1

由於東部和西部的會議團隊在一張桌子上,你可以做的最好的事情就是獲得西部所有會議團隊的<tr>標籤。

doc.xpath("//table/tr[td//text()[contains(., 'Western Conference')]]/following-sibling::tr") 
0
require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 

url = "http://www.nba.com/standings/team_record_comparison/conferenceNew_Std_Cnf.html" 
@doc = Nokogiri::HTML(open(url)) rescue nil 
@doc.css('.confTitle').each do |team| 
    if team.text == "Western Conference" 
    # do your stuff 
    end 
end 

您可以檢查CSS的文本,然後你會保存或打印數據/

+0

小心使用拖尾'救援零'。它涵蓋了該行發生的所有異常,包括Nokogiri和OpenURI內發生的任何異常。如果觸發,「@ doc」將爲零,導致「@ doc.css」以意想不到的方式失敗。而且,在這樣的例子中'@ doc'不是必需的,因爲不需要實例變量。 –

0

這裏是我如何使用CSS存取做到這一點:

require 'nokogiri' 
require 'open-uri' 

url = "http://www.nba.com/standings/team_record_comparison/conferenceNew_Std_Cnf.html" 
doc = Nokogiri::HTML(open(url)) 
table = doc.at('.genStatTable') 

table現在指向表格的頂部。

rows = Nokogiri::XML::NodeSet.new(Nokogiri::HTML::Document.new) 

rows是一個NodeSet,它與我們的目的相似。

查看classconfTitle並獲得其父母<tr>的第二個/最後一個單元格的表格。循環而節點在這個級別中發現:

tr = table.css('.confTitle').last.parent 
while tr do 
    rows << tr 
    tr = tr.next 
end 

puts rows.to_html 

這將返回所有<tr>節點列表開始:

<tr> 
<td colspan="11" class="confTitle">Western Conference</td> 
     </tr> 

和結尾:

<tr class="odd"> 
<td class="team"><a href="/jazz">Utah</a></td> 
      <td>1</td> 
      <td>3</td> 
      <td>0.250</td> 
      <td>3.5</td> 
      <td>1-3</td> 
      <td>0-2</td> 
      <td>1-2</td> 
      <td>0-1</td> 
      <td>1-3</td> 
      <td>L 3</td> 
     </tr> 

裏面嵌入它一個表,這可能會更有用:

require 'nokogiri' 
require 'open-uri' 

url = "http://www.nba.com/standings/team_record_comparison/conferenceNew_Std_Cnf.html" 
doc = Nokogiri::HTML(open(url)) 

doc2 = Nokogiri::HTML('<html><body><table></table></body></html>') 
doc2_table = doc2.at('table') 

tr = doc.css('.genStatTable .confTitle').last.parent 
while tr do 
    doc2_table.add_child(tr.to_html) 
    tr = tr.next 
end 

puts doc2.to_html 

在此,doc2是一個存根HTML文檔,其中找到的節點可以存儲/記憶。