2010-08-14 6 views
3

En ce moment, je vais partager le document HTML en petits morceaux comme celui-ci: (expression régulière simplifiée - sauter le contenu des balises d'en-tête et balise de fermeture)Comment diviser un document HTML en utilisant Nokogiri?

document.at('body').inner_html.split(/<\s*h[2-6][^>]*>/i).collect do |fragment| 
    Nokogiri::HTML(fragment) 
end 

Est-il un moyen plus facile à réaliser que le partage?

Le document est très simple, il ne contient que des en-têtes, des paragraphes et du texte formaté. Par exemple:

<body> 
<h1>Main</h1> 
<h2>Sub 1</h2> 
<p>Text</p> 
----- 
<h2>Sub 2</h2> 
<p>Text</p> 
----- 
<h3>Sub 2.1</h3> 
<p>Text</p> 
----- 
<h3>Sub 2.2</h3> 
<p>Text</p> 
</body> 

Pour cet échantillon, je dois obtenir quatre pièces.

+3

Pourquoi utilisez-vous regex quand elle est déjà un analyseur XML? – NullUserException

+2

NullUserException, je ne connais pas de meilleure façon de le faire encore, c'est pourquoi je demande. – taro

+0

Peut-être essayer l'un de ceux-ci: http://zvon.org/comp/r/tut-XPath_1.html#Pages~List_of_XPaths – Erik

Répondre

4

Je devais juste faire quelque chose de similaire. Je diviser un grand fichier HTML en "chapitres" où un chapitre est démarré par un tag <h1>. Je voulais aussi garder le titre des chapitres dans le hachage et ignorer tout avant le premier tag <h1>.

Voici le code:

full_book = Nokogiri::HTML(File.read('full-book.html')) 
@chapters = full_book.xpath('//body').children.inject([]) do |chapters_hash, child| 
    if child.name == 'h1' 
    title = child.inner_text 
    chapters_hash << { :title => title, :contents => ''} 
    end 

    next chapters_hash if chapters_hash.empty? 
    chapters_hash.last[:contents] << child.to_xhtml 
    chapters_hash 
end 
+0

Bonne solution, merci! – taro

+0

Je viens de changer la ligne "child.to_html" en "child.to_xhtml". De cette façon, vous obtenez une sortie plus agréable. –

+0

Pour des scissions plus complexes (sur chaque balise HTML par exemple), consultez 'Nokogiri :: XML :: SAX :: Document'. – Archonic

Questions connexes