使用css选择器选择具有某个类但没有样式属性的所有div元素

时间:2012-08-17 17:24:38

标签: css css-selectors

我正在编写一个wombat的抓取工具。不知怎的,我正在使用CSS选择器,而不是XPATH。我在这里选择非常困难 - 我用css无法实现。

我想从页面中抓取div元素:

<div class="do_cat_ads_box"> ... </div>
<div class="do_cat_ads_box2"> ... </div>
<div class="do_cat_ads_box" style=".."> ...</div>
<div class="do_cat_ads_box2" style=".."> ... </div>

但具有'style'属性的元素 - 是我不需要的垃圾(广告)。

所以我的问题是,我可以使用类'do_cat_ads_box'和'do_cat_ads_box2'获取所有div元素,但是避免使用具有'style'属性的div元素吗?

我最终得到了类似的东西而且它无法正常工作:

application 'css=div.do_cat_ads_box2, div.do_cat_ads_box,  div.do_cat_ads_box:not(@style)', :iterator do
  href 'css=div.do_cat_ads_image  a @href'
  name 'css=div.do_cat_ads_detail a'
end

如果它不是css选择器的两倍,那么总是有xpath方式。但我对css-selectors方法非常感兴趣。

3 个答案:

答案 0 :(得分:1)

抓住所有定义类的元素非常简单:

div[class]

符合CSS3标准的现代浏览器(caniuse.com/#feat=css-sel3)也有一个:not()选择器,允许您访问所有具有类但没有样式的div:

div[class]:not([style])

如果您的浏览器或HTML解析器仅支持CSS2,则必须使用jQuery(在所有浏览器中支持:not())或使用div [class]选择器并手动循环结果(无论使用何种语言)你正在使用)并删除具有样式属性的项目。如果它支持CSS3,第二个选择器将一次完成你想要的一切。

答案 1 :(得分:0)

如果您想支持IE9以下的任何内容,则无法使用CSS。你需要JS。

答案 2 :(得分:0)

Attribute selectors in CSS使用[attr]表示法。 @attr表示法与属性定位符(以及XPath)有关。

假设Wombat支持属性选择器的CSS语法,请尝试将:not(@style)更改为:not([style])并将类选择器重写为以下内容:

application 'css=div.do_cat_ads_box:not([style]), div.do_cat_ads_box2:not([style])', :iterator do
  href 'css=div.do_cat_ads_image  a @href'
  name 'css=div.do_cat_ads_detail a'
end