7
votes

Nokogiri équivalent de la méthode la plus proche de JQuery () pour trouver le premier ancêtre correspondant à Arbre

jQuery a une belle méthode uniformément surmontée appelée le plus proche () qui marche de l'arbre Dom pour un élément correspondant. Par exemple, si j'ai ce code HTML: xxx

supposant élément est défini sur , alors je peux comprendre le Valeur de src comme ceci: xxx

et qui reviendra bien "non défini" si l'élément de table ou son attribut SRC est manquant. < / P>

Ayant été habitué à cela à Javascriptland, j'aimerais trouver quelque chose d'équivalent pour Nokogiri à Rubyland, mais le plus proche que j'ai pu proposer est ce hack distinctement inéléble en utilisant ancêtres () : xxx

Le ternaire est nécessaire car il est d'abord renvoyé nil si appelé un tableau vide. Meilleures idées?


0 commentaires

3 Réponses :


12
votes

Vous pouvez appeler premier code> sur une matrice vide, le problème est qu'il retournera nil code> et vous ne pouvez pas dire nil ["src '] sans devenir triste. Vous pouvez faire ceci: xxx pré>

et si vous êtes dans des rails, vous pouvez utiliser essayer code> ainsi: p> xxx pré> Si vous faites ce genre de chose beaucoup, cachez la laideur dans une méthode: p> xxx pré>

et ensuite p> xxx pré>

Vous pouvez également le corriger directement dans Nokogiri :: XML :: Node (mais je ne le recommanderais pas): P>

class Nokogiri::XML::Node
  def closest(selector)
    ancestors(selector).first
  end
  def closest_attr(selector, attr)
    a = closest(selector)
    a ? a[attr] : nil
  end
end


2 commentaires

Réponse acceptée pour une exhaustivité pure - pourrait simplement soumettre votre patch à Nokogiri en tant que demande de tir!


Ruby 2.3 présente le opérateur de navigation sécurisé , < code> &. , vous pouvez donc faire élément.ancestors ("table"). Premier & .src



6
votes

Vous pouvez également le faire avec XPath:

element.xpath('./ancestor::table[1]')


0 commentaires

3
votes

Vous voulez que le src attribut de l'ancêtre de la table la plus proche, s'il existe? Au lieu d'obtenir un élément qui pourrait exister via XPath, puis peut-être obtenir l'attribut via Ruby, demandez l'attribut directement dans xpath: xxx

Vous obtiendrez l'attribut ou nul: xxx


0 commentaires