与Nokogiri的CSS选择器中的两个nots

时间:2013-03-16 02:34:53

标签: css ruby nokogiri

现在我有一个使用jQuery的选择器,如下所示:

.original-tweet:not([data-is-reply-to="true"],.retweeted)

然而,使用红宝石中的Nokogiri宝石似乎无效:

doc.css('.original-tweet:not([data-is-reply-to="true"],.retweeted)')

上面会产生现金,但每个部分都不能独立工作:

 doc.css('.original-tweet:not([data-is-reply-to="true"])')

 doc.css('.original-tweet:not(.retweeted)')

实际获得我想要的选择器的最佳方法是什么。这是nokogiri不支持的东西吗?

3 个答案:

答案 0 :(得分:3)

好的,我用XPATH解决了它

以下工作(注意:我创建的xpath完全是由计算机生成的)

doc.xpath("//*[contains(concat(' ', @class, ' '), ' original-tweet ') and not(@data-is-reply-to = \"true\") and not(@data-retweet-id)]")

编辑:进一步检查显示这仍然是选择转发类的项目(事实证明这是我的错误假设,我应该一直在寻找data-retweet-id属性而不是转推类)< / p>

github.com/sparklemotion/nokogiri/issues/451 - 这个问题与我在这里需要使用xpath的原因有关。

答案 1 :(得分:1)

虽然选择器可以使用jQuery,但它不是有效的CSS选择器:

> $$('.original-tweet:not([data-is-reply-to="true"], .retweeted)')
Error: SyntaxError: DOM Exception 12

.original-tweet:not([data-is-reply-to="true"]):not(.retweeted)应该有用。

答案 2 :(得分:1)

目前可能的解决方法可能是:

doc.css('.original-tweet:not([data-is-reply-to="true"])') - doc.css('.retweeted')