2017-08-02 12 views
3

私のレールアプリケーションでnokogiri gemを使用してhtmlノードを取得しています。私はクラスでクラスを取得しています。しかし、そのクラス名は時々変わるでしょう。Nokogiri - 正規表現でクラスとdivを取得する

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

が、「X15」とは、例えば、「X13」することができる:例えば、今私はこのようにそれを取得しています。私はこのような何かができる:

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

これは動作しますが、私はそれはX14が来るので、もし、私はそれを維持する必要はありません、X13-X15のように、範囲を設定することがよりよいことだと思いますとても冗長です。

どのようにすればいいですか?ありがとう!

EDIT:

私は「×*」クラスを削除することはできません、「どのような違い2つの要素を 『X』クラスである別のクラスと同じなので、持つ別のdivがあります原因。もう1つはxa、xbです。私が得ようとしているのはx13、x15です。

+0

'doc.css(" div.t.m0.h3.ff2.fs1.fc0.sc0.ls0.ws1 ")' x13'または 'x15')、選択した要素に' x \ d \ d'クラスがあるかどうかを確認します。 – GolfWolf

+0

変更の影響を受けていないセレクタでdivをターゲティングすることはできますか?マークアップはどのように見えますか?なぜクラスは変わるのですか? _ "x15はx13にすることができます" _少し恣意的なようです。 – Stefan

+0

その人はできません、質問を更新しました。 x *クラスを削除するともう一つの要素があります –

答えて

1

.xpathメソッドを使用できます。例えば。正規表現による検索

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

または使用することができます

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

は、XPath 2.0に表示されますが、私は、XPathバージョン鋸山がサポートするのか分かりません。

1

次の操作を行うことができます

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

あなたは本当にあなたがselect使用するregexで必要な場合:

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

注:正規表現は何を期待しないことを。また、selectを使用すると、ノードセットが配列になります

関連する問題