2016-01-28 35 views
-1

我有以下語法表:HREF解析問題的for循環

<tbody> 
    <tr> 
    <td><a href=""></a></td> 
    <td></td> 
    <td></td> 
    </tr> 
    <tr> 
    <td><a href=""></a></td> 
    <td></td> 
    <td></td> 
    </tr> 
    ...... 
</tbody> 

我能提取路段如下:

link = page.css('tbody tr td a')[1]['href'] 

然而,當我試圖做到這一點在一個for環,它失敗和我接收有關未定義的方法「[]」的錯誤:

rows = page.css('tbody tr') 
$numRows = rows.count 
links = Array.new 
(0..$numRows-1).each do |i| 
    links.push(page.css('tbody tr td a')[i]['href']) 

我能夠固定使用此代碼我的問題:

rows = page.css('tbody tr') 
rows.shift 
$num_updates = rows.count 
puts rows.count 

links = Array.new 
page.css('tbody tr td a').each do |i| 
links.push(i.attr('href')) 
end 

columns = Hash.new 
(0..$num_updates-1).each do |i| 
columns[i] = rows[i].text 
columns[i] = columns[i].split("\n") 
end 
+1

什麼是您預期的輸出?您的代碼也無效。我們需要看到句法正確的代碼。請閱讀「[問]」和「[mcve]」。像'$ numRows'這樣的全局使用是代碼味道;根本不用理解爲什麼你應該使用全局變量,這表明你不瞭解變量範圍。 'numRows'應該是'num_rows',因爲Ruby中的變量是snake_case,而不是camelCase。 –

+0

你是怎麼得到這個HTML的?如果您使用瀏覽器向您顯示源代碼,則不要這樣做;相反,請使用cURL,'wget',HTTPClient等請求HTML,這樣可以在不使用瀏覽器的情況下檢索HTML。瀏覽器在HTML上進行修改,並且經常添加不在原始HTML中的'tbody'標籤。 –

+0

我獲得了html如下 - page = Nokogiri :: HTML open('https://support.apple.com/en-us/HT201222') – A21

回答

0

i環路上的<td>標籤的數量,但只有其中一個TDS的中有一個<a>,所以('tbody tr td a')[1]不存在。

+0

確實存在page.css('tbody tr td a')[1] ['href']等值,因爲我可以打印出這些值。我只是不知道如何通過for循環將這些值推入數組中。嘗試瞭解Nokogiri/ruby​​語法。 – A21

0

默想這樣的:

doc = Nokogiri::HTML::DocumentFragment.parse(<<EOT) 
<tbody> 
    <tr> 
    <td><a href="foo"></a></td> 
    <td></td> 
    <td></td> 
    </tr> 
    <tr> 
    <td><a href="bar"></a></td> 
    <td></td> 
    <td></td> 
    </tr> 
</tbody> 
EOT 

doc.search('a').map(&:to_html)  # => ["<a href=\"foo\"></a>", "<a href=\"bar\"></a>"] 
doc.search('a').map{ |n| n['href'] } # => ["foo", "bar"] 

doc.search('a').map{ |n| n['href'] }[1] # => "bar" 

或:

doc.search('a')[1]['href']    # => "bar"