我正在编写一个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方法非常感兴趣。
答案 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