2009-06-29 14 views
1
私は一定の基準(クラス=「int型」またはクラス=「EXT」)を満たしていないHTMLページ(実際にはTinyMCEはユーザー入力)からのすべての画像を削除したい

と私は正しいアプローチでstruggelingよ。それは私がこれまでやってんだよ:Hpricot要素交差点

hbody = Hpricot(input) 
@internal_images = hbody.search("//img[@class='int']") 
@external_images = hbody.search("//img[@class='ext']") 

をしかし、私はクラスが誤った値(ない「INT」または「EXT」)を有するイメージを検索するための方法がわかりません。

Iはまた、標準のHTML(私は属性dbsrcに設定されたDBのID、のような内部値を設定するためにそれらを使用する)ではない他の属性をチェックする要素をループしなければなりません。これらの属性にもアクセスできますか?条件に合致しない特定の要素(hpricot検索結果に含まれる要素)を削除する方法はありますか?

ありがとうございました!

答えて

3
>> doc = Hpricot.parse('<html><img src="foo" class="int" /><img src="bar" bar="42" /><img src="foobar" class="int"></html>') 
=> #<Hpricot::Doc {elem <html> {emptyelem <img class="int" src="foo">} {emptyelem <img src="bar" bar="42">} {emptyelem <img class="int" src="foobar">} </html>}> 
>> doc.search("img")[1][:bar] 
=> "42" 
>> doc.search("img") - doc.search("img.int") 
=> [{emptyelem img src"bar" bar"42"}] 

検索結果を取得したら、通常の配列操作を使用できます。非標準の属性は[]からアクセスできます。

+0

うわー、とても簡単なので、私は「collection_one - collection_two」を使用することができますcollection_twoであるcollection_oneからすべての要素を削除するには?ありがとう! –

+0

重要な注意点は、 'z = x - y'の後では、xは変更されません.zは、yにないxのすべてを含んでいます。 – rampion

+0

yep、コレクションを追加する場合は+を入力します。 'all_images - (internal_images + external_images)'です。 –

2

not CSS selectorをチェックしてください。

(hbody."img:not(.int)") 
(hbody."img:not(.ext)") 

残念ながら、あなたが式を連結できないようです。すべてのimgノードを取得し、.cssセレクタに.intも.extも含まないものを削除することができます。 さらに、difference演算子を使用して、どちらの要素が両方のコレクションに含まれていないかを計算できます。 Hpricot Alteringドキュメント:

は、ノードまたは要素を除去する.remove方法を使用します。

+0

私は最終的に私が検索を連結すること望んでいたものを達成できます。hbody.search(「IMG」)、検索(「:ない(.INT)」)。検索(「:ありません(.EXT)が」)。どこのすべての画像を返します。クラスは "int"ではなく "ext"ではありません。それらを削除した後、私は他の属性をチェックし、基本的に同じことを行うことができます。再度、感謝します! –