2009-06-29 52 views
1

我想从不符合某些条件(class =“int”或class =“ext”)的HTML页面(实际上是tinymce用户输入)中删除所有图像,并且我正在使用正确的方法。这就是我在做什么至今:Hpricot元素交叉点

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

但我不知道如何找到图像所在班级有错误的值(不是“内部”或“外部”)。

我还必须遍历元素来检查其他属性,这些属性不是标准的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_one中删除collection_two中的所有元素?谢谢! – 2009-06-29 15:01:20

+0

重要提示,在'z = x - y'之后,x不会改变,z只会包含所有不在y中的x。 – rampion 2009-06-29 15:09:18

2

查看not CSS selector

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

不幸的是,它似乎并不能连接表达式。您可能想要获取所有img节点,并删除那些.css选择器既不包含.int也不包含.ext的节点。 此外,您可以使用差异运算符来计算哪些元素不是两个集合的一部分。

使用.remove方法删除节点或元素:Hpricot Altering文档。