Nokogiri cómo obtener el texto principal y no el niño de texto y de referencia en el texto a su padre
Pregunta
Digamos que tengo este ejemplo:
page = "<html><body><h1 class='foo'></h1><p class='foo'>hello people<a href='http://'>hello world</a></p></body></html>"
@nodes = []
Nokogiri::HTML(page).traverse do |n|
if n[:class] == "foo"
@nodes << {:name => n.name, :xpath => n.path, :text => n.text }
end
end
los resultados para el n.text
sería hello peoplehello world
, Quiero hacerlo de una manera para que yo pueda llegar a los padres de texto y su niño de texto, pero relacionarlas con su etiqueta
así, el resultado sería algo como
@nodes[0][:text]=""
@node[1][:text]= [{:Elementtext1 => "hello people", :ElementObject1 => elementObject},{:Elementtext2 => "hello world", :ElementObject2 => elementObject}]
Solución
No vamos
require 'rubygems'
require 'nokogiri'
doc = Nokogiri::HTML(DATA.read)
nodes = doc.root.css('.foo').collect do |n|
{ :name => n.name,
:xpath => n.path,
:text => n.xpath('.//text()').collect{|t|
{ :parent => t.parent.name,
:text => t.text }}}
end
p nodes
__END__
<html>
<body>
<h1 class='foo'></h1>
<p class='foo'>hello people<a href='http://'>hello world</a></p>
</body>
</html>
no se puede llegar a todos los elementos utilizando traverse
ya que sólo visita los hijos directos de la raíz. Por lo tanto, yo uso un selector CSS para obtener todos los elementos con foo
clase. Y entonces, para cada elemento que se encuentra, utilizo un selector XPath para obtener todos los nodos de texto debajo de ella.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow