2 votes

Nokogiri extrait les nœuds du html

J'ai besoin d'extraire des nœuds du html (pas du texte intérieur afin de préserver le format pour des recherches manuelles ultérieures). J'ai écrit le code ci-dessous. Mais à cause de la façon dont traverse fonctionne, j'ai obtenu des doublons dans le nouveau fichier html.

C'est le vrai html à analyser. http://www.sec.gov/Archives/edgar/data/1750/000104746912007300/a2210166z10-k.htm

J'ai besoin d'extraire la rubrique 10 et la partie entre "Executive Officers of the Registrant" et la rubrique suivante. Le point 10 figure dans tous les documents, mais "Executive Officers of the Registrant" ne figure pas dans tous les documents. J'ai besoin d'obtenir les nœuds plutôt que le simple texte parce que je veux préserver les tableaux, de sorte qu'à l'étape suivante, je puisse analyser les tableaux dans ces sections, s'il y en a.

Exemple de html :

html = "
<BODY>
<P>Dont need this </P>  
<P>Start</P>
<P>Text To Extract 1 </P>
<P><Font><B>Text to Extract 2 </B></Font></P>
<DIV><TABLE>
<TR>
<TD>Text to Extract 3</TD>
<TD>Text to Extract 4</TD>
</TR>
</TABLE></DIV>
<P>End</P>
</BODY>
"

Je veux obtenir :

html = "
<BODY>
<P>Start</P>
<P>Text To Extract 1 </P>
<P><Font><B>Text to Extract 2 </B></Font></P>
<DIV><TABLE>
<TR>
<TD>Text to Extract 3</TD>
<TD>Text to Extract 4</TD>
</TR>
</TABLE></DIV>
<P>End</P>
</BODY>
"

Commencez à extraire lorsque le mot-clé start apparaît. Fin pour extraire lorsque le mot-clé fin apparaît.

Je dois extraire plusieurs sections d'un document html. Les mots-clés peuvent apparaître dans des nœuds avec des noms différents.

doc.at_css('body').traverse do |node|
    inMySection  = false

    if node.text.match(/#{start_keyword}/)
        inMySection = true
    elsif node.text.match(/#{end_keyword}/)
        inMySection = false
    end
    if inMySection
        #Extract the nodes
    end
end

J'ai également essayé d'utiliser xpath pour y parvenir, sans succès, après avoir consulté ces articles :

Axe XPath, obtenir tous les nœuds suivants jusqu'à ce que

XPath pour trouver tous les frères et sœurs suivants jusqu'au frère ou à la sœur suivant(e) d'un type particulier

1voto

toch Points 2268

Ce n'est pas un problème avec Nokogiri mais avec votre algorithme. Vous avez mis votre drapeau inMySection à l'intérieur de votre boucle, ce qui signifie qu'à chaque étape vous le remettez à false et vous perdez s'il était précédemment fixé à true.

Sur la base de votre exemple d'entrée et de sortie HTML, l'extrait suivant fonctionne :

nodes = Nokogiri::HTML(html)
inMySection  = false
nodes.at_xpath('//body').traverse do |node|
  if node.text.match(/Start/)
    inMySection = true
  elsif node.text.match(/End/)
    inMySection = false
  end
  node.remove unless inMySection
end
print nodes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X