2009-12-06 8 views
1

Disons que j'ai cet exemple:Nokogiri comment obtenir le texte parent et non le texte Childs et référence le texte à son parent

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 

les résultats seraient pour la n.text seraient hello peoplehello world, je veux le faire d'une manière que je puisse obtenir le texte parent et son texte Childs, mais les rapporter à leur étiquette

de sorte que le résultat serait quelque chose comme

@nodes[0][:text]="" 
@node[1][:text]= [{:Elementtext1 => "hello people", :ElementObject1 => elementObject},{:Elementtext2 => "hello world", :ElementObject2 => elementObject}] 

Répondre

1

il nous allons

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> 

vous ne pouvez pas accéder à tous les éléments en utilisant traverse car il visite que les enfants directs de la racine. Par conséquent, j'utilise un sélecteur CSS pour obtenir tous les éléments avec la classe foo. Et puis, pour chaque élément trouvé, j'utilise un sélecteur xpath pour obtenir tous les nœuds de texte en dessous.

+0

merci beaucoup adrian – Waheedi