Hpricot元素交集

时间:2009-06-29 14:43:00

标签: ruby-on-rails ruby parsing hpricot

我想删除HTML页面中的所有图像(实际上是用户输入),这些图像不符合某些条件(class =“int”或class =“ext”),我正在采用正确的方法。这就是我到目前为止所做的事情:

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

但我不知道如何找到类错误值(不是“int”或“ext”)的图像。

我还必须循环遍历元素以检查非标准html的其他属性(我使用它们来设置内部值,例如我在属性dbsrc中设置的DB id)。我是否也可以访问这些属性,是否有办法在不符合我的条件时删除某些元素(在hpricot搜索结果中)?

感谢您的帮助!

2 个答案:

答案 0 :(得分: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"}]

获得搜索结果后,您可以使用常规数组操作。非标准属性可通过[]。

访问

答案 1 :(得分:2)

查看not CSS selector

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

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

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