Nokogiri cómo obtener el texto principal y no el niño de texto y de referencia en el texto a su padre

StackOverflow https://stackoverflow.com/questions/1855525

  •  13-09-2019
  •  | 
  •  

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}]
¿Fue útil?

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
scroll top