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: supposant 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 () : p> Le ternaire est nécessaire car il est d'abord renvoyé nil si appelé un tableau vide. Meilleures idées? P> p>
3 Réponses : Vous pouvez appeler et si vous êtes dans des rails, vous pouvez utiliser et ensuite p> Vous pouvez également le corriger directement dans Nokogiri :: XML :: Node (mais je ne le recommanderais pas): P>
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> &. code>, vous pouvez donc faire Vous pouvez également le faire avec XPath: Vous voulez que le Vous obtiendrez l'attribut ou nul: p> élément code> est défini sur
code>, alors je peux comprendre le Valeur de src code> comme ceci: p>
votes
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:
essayer code> ainsi: 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
élément.ancestors ("table"). Premier & .src code>
votes
element.xpath('./ancestor::table[1]')
votes
src code> 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: