6
votes

Comment analyser les étiquettes consécutives avec Nokogiri?

J'ai un code HTML comme ceci: xxx

mon code ne fonctionne pas. xxx

Afficher tout

Tags premiers, puis sur les balises
et j'ai besoin de "étiquette: valeur"

0 commentaires

3 Réponses :


1
votes

Après avoir regardé l'autre réponse ici, voici une manière inefficace de faire la même chose.

require 'nokogiri'
a = Nokogiri::HTML('<div id="first"><dt>Label1</dt><dd>Value1</dd><dt>Label2</dt><dd>Value2</dd></div>')

dt = []
dd = []

a.css("#first").each do |item|
  item.css("dt").each {|t| dt << t.text}
  item.css("dd").each {|t| dd << t.text}
end

dt.each_index do |i|
  puts dt[i] + ': ' + dd[i]
end


2 commentaires

Notez que depuis "# premier" ne peut jamais correspondre qu'un seul élément, ce que vous avez est équivalent (mais pire) que: élément = A.AT_CSS ("# premier") . Utiliser chaque à l'extérieur est entièrement superflu.


Notez également que cette réponse suppose qu'il existe toujours exactement un jumelage 1-1 entre

et un
. Bien que cela soit vrai pour le marquillage d'une question initiale, il n'est peut-être pas toujours vrai dans le marquage du monde réel. Enfin, avec une itération de deux tableaux jumelés, vous pouvez envisager d'utiliser dt.zip (dd). Cherchez {| DT, DD | ...} au lieu de chaque_with_index .



6
votes

Tout d'abord, votre HTML doit avoir le

code> et
code> éléments à l'intérieur d'un
code>:
doc = Nokogiri::HTML('<div id="first"><dl>...')
doc.css('#first').search('dt').each do |node|
    puts "#{node.text}: #{node.next_element.text}"
end


2 commentaires

Au lieu de doc.css ('# premier'). Rechercher ('dt'). Chaque pourquoi pas seulement doc.css ('# premier dt'). Chaque ? Notez également que cette réponse fonctionne sous l'hypothèse selon laquelle il existe toujours une seule et unique-one

immédiatement après chaque
(ce qui pourrait ne pas être le cas en général HTML).


@Phrogz: Pas de bonne raison pour .css.search autre que, peut-être, il est plus proche de ce que l'OP a déjà. Et j'ai inclus un "qui devrait fonctionner aussi longtemps que la structure correspond à votre exemple" CAVEAT. J'accepterais que votre approche fonctionnerait mieux dans un cas général. (Ceci est juste une correction d'orthographe de mon dernier commentaire Cuz I Dun Haz Gud Speling)



6
votes

Sous l'hypothèse selon laquelle certains

peuvent avoir plusieurs
, vous souhaitez trouver tous les
et ensuite ( Pour chaque), recherchez les
avant le prochain
. C'est assez facile à faire à Pure Ruby, mais plus amusant à faire dans Just Xpath. ;)

Compte tenu de cette configuration: xxx

à l'aide de non XPath : xxx

à l'aide d'un peu xpath : xxx

à lota xpath : xxx


0 commentaires