Come collegare attraverso una tabella e girare righe in oggetti utilizzando nokogiri
Domanda
voglio usare nokogiri il ciclo in un html e creare un oggetto corrispondente a ogni riga. Sono in grado di definire le XPaths radice dove voglio i dati per riempire l'oggetto varibles viene da ma non so come raggruppare questi come un oggetto.
Il mio codice è sotto. Lo so che non funziona, ma non so quale direzione andare per farlo funzionare.
require 'RubyGems' require 'nokogiri'
doc = Nokogiri :: HTML.parse (<< - HTML_END) " LV1LV2LV3 MV1MV2MV3 NV1NV2NV3 " HTML_END
class Messaggio def inizializzazione (v1, v2, v3) @ V1 = v1 @ V2 = v2 @ V3 = v3 end
def v1= (v1)
@v1 =v1
end
def v2
@v2 =v2
end
def v3
@v3 =v3
end
end
PostList classe DEF inizializzare @posts = Array.new end
def append(aPost)
@posts.push(aPost)
self
end
def deleteFirst
@posts.shift
end
def deleteLast
@posts.pop
end
end
list = PostList.new
parent = doc.css ( 'body'). Prima
ottiene visualizzato il contenuto della riga
parent.xpath ( "// div / table [@ class = 'ipbtable'] / tr") .Ogni do | a_tag |
k1 = "x" k2 = "x" k3 = "x"
a_tag.xpath ( "td [1]") ogni do |. X_tag |
mette x_tag.content
end
list.append (Post.new (k1, k2, k3))
end
Soluzione
Il problema principale con il codice sembra essere si sta passando stringhe ('K1', 'K2', 'K3'
) che ricordano vagamente i nomi delle variabili, piuttosto che le variabili stesse (k1, k2, k3
). Tuttavia, si potrebbe esprimere questo più brevemente come:
doc.search('table > tr').each do |row|
properties = row.search('td/text()').collect {|text| text.to_s}
list.append Post.new(*properties)
end
Questo loop semplicemente sopra ogni riga e crea un messaggio utilizzando il contenuto testuale di ogni TD nella riga.