2017-08-02 1 views
3

J'utilise nokogiri gem sur mon application rails pour obtenir des nœuds html. Je reçois ma div par sa classe. Mais ce nom de classe va changer parfois. Par exemple, je reçois en ce moment comme ceci:Nokogiri - Get div avec classe par regex

doc.css("div.t.m0.x15.h3.ff2.fs1.fc0.sc0.ls0.ws1") 

mais que « x15 » peut être « x13 », par exemple. Je pouvais faire quelque chose comme ceci:

doc.css("div.t.m0.x13.h3.ff2.fs1.fc0.sc0.ls0.ws1", "div.t.m0.x15.h3.ff2.fs1.fc0.sc0.ls0.ws1") 

Ce travaillerais, mais je pense qu'il serait plus agréable de définir une plage, comme x13-x15, donc s'il est un x14, je ne ai pas besoin de le garder si bavard.

Des conseils sur la façon de faire cela? Merci!

EDIT:

Je ne peux pas enlever la classe « x * », parce que il y a un autre div avec la même une autre classe, donc quelles différences les deux éléments est la classe « x ». L'autre est xa, xb; et celui que j'essaye d'obtenir est x13, x15.

+0

ne pourriez-vous pas faire 'doc.css (" div.t.m0.h3.ff2.fs1.fc0.sc0.ls0.ws1 ")' (sans le ' x13' ou 'x15'), puis vérifiez si l'élément sélectionné possède également une classe' x \ d \ d'? – GolfWolf

+0

Peut-être que vous pouvez cibler la div avec un sélecteur qui n'est pas affecté par le changement? À quoi ressemble votre balisage? Pourquoi la classe change-t-elle? _ "x15 peut être x13" _ semble un peu arbitraire. – Stefan

+0

Ne peut pas faire cela les gars, mis à jour la question. Il y a un autre élément que j'obtiendrais si je supprimais la classe x * –

Répondre

1

Vous pouvez utiliser la méthode .xpath à cette fin. Par exemple.

doc.xpath("//div[@class='x13' or @class='x15']") 

Ou vous pouvez utiliser

//div[starts-with(@class, 'x') and (ends-with(@class, '13') or (ends-with(@class, '15'))] 

Recherche par regexp apparaît dans XPath 2.0, mais je ne sais pas quelle version de XPath nokogiri soutient.

1

Vous pouvez effectuer les opérations suivantes:

base_classes = '.t.m0.h3.ff2.fs1.fc0.sc0.ls0.ws1' 
extra_classes = ['.x15', '.x13'] 
doc.css(*extra_classes.map { |extra_class| "div#{base_classes}#{extra_class}" }) 
1

Si vous avez vraiment besoin regex vous utiliseriez select:

doc.css("div.t.m0.h3.ff2.fs1.fc0.sc0.ls0.ws1"). 
    select{|div| div[:class][/x1[3-5]/]} 

Note: que regex ne peut pas faire ce que vous attendez. Notez également: en utilisant select transforme votre NodeSet en un tableau