【问题标题】:Hpricot Element intersectionHpricot 元素交叉点
【发布时间】:2009-06-29 14:43:00
【问题描述】:

我想从 HTML 页面(实际上是 tinymce 用户输入)中删除所有不符合特定标准(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 搜索结果中)不符合我的条件时删除它们?

感谢您的帮助!

【问题讨论】:

    标签: ruby-on-rails ruby parsing hpricot


    【解决方案1】:
    >> 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"}]
    

    一旦获得搜索结果,您就可以使用正常的数组操作。非标准属性可通过 [] 访问。

    【讨论】:

    • 哇,很简单,所以我可以使用“collection_one - collection_two”从collection_one 中删除collection_two 中的所有元素?谢谢!
    • 重要提示,z = x - y 之后,x 不会改变,z 只会包含所有不在 y 中的 x。
    • 是的,和 + 添加收藏,例如all_images - (internal_images + external_images).
    【解决方案2】:

    查看not CSS selector

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

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

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

    【讨论】:

    • 我终于可以通过链接搜索来实现我想要的:hbody.search("img").search(":not(.int)").search(":not(.ext) ") 返回类不是“int”而不是“ext”的所有图像。删除它们后,我可以检查其他属性并进行基本相同的操作。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2010-11-29
    • 1970-01-01
    相关资源
    最近更新 更多