Cómo recorrer una mesa y convertir filas en objetos usando nokogiri
Pregunta
Quiero usar nokogiri a bucle a través de un html y crear un objeto que corresponde a cada fila. Soy capaz de definir los XPath raíz en el que necesito los datos para rellenar el objeto varibles proviene de pero no sé cómo agrupar estos como un objeto.
Mi código está por debajo. Sé que no funciona pero no sé qué dirección tomar para hacer que funcione.
require '' rubygems require 'nokogiri'
doc = Nokogiri :: HTML.parse (<< - HTML_END) " LV1LV2LV3 MV1MV2MV3 NV1NV2NV3 " HTML_END
poste de la clase def inicializar (v1, v2, v3) @ V1 = v1 @ V2 = v2 @ V3 = v3 final
def v1= (v1)
@v1 =v1
end
def v2
@v2 =v2
end
def v3
@v3 =v3
end
end
PostList clase def inicializar @posts = Array.new final
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 ( 'cuerpo'). Primero
obtiene los contects de la fila
parent.xpath ( "// div / tabla [clase @ = 'ipbtable'] / tr") .Cada hacer | a_tag |
k1 = "x" k2 = "x" k3 = "x"
a_tag.xpath ( "td [1]") cada uno haga |. X_tag |
pone x_tag.content
end
list.append (Post.new (k1, k2, k3))
end
Solución
El principal problema con el código parece ser que está pasando cuerdas ('K1', 'K2', 'K3'
) que recuerdan vagamente a los nombres de las variables en lugar de los propios (k1, k2, k3
) variables. Sin embargo, se podría expresar esto más sucintamente como:
doc.search('table > tr').each do |row|
properties = row.search('td/text()').collect {|text| text.to_s}
list.append Post.new(*properties)
end
Esto simplemente bucles sobre cada fila y crea un mensaje con el contenido textual de cada td en la fila.