我想知道Scrapy是否有基于CSS中定义的颜色来刮取数据的方法。例如,选择background-color: #ff0000
的所有元素。
我试过这个:
response.css('td::attr(background-color)').extract()
我期待一个列表,其中包含为表数据元素设置的所有背景颜色,但它返回一个空列表。
通常可以在Scrapy中通过CSS属性定位元素吗?
答案 0 :(得分:13)
最简单的答案是否,仅凭Scrapy不可能做到这一点。
使用:attr()
选择器可以访问元素属性,但是background-color
是CSS property。
现在要了解的重要一件事是,有多种不同的方法来定义页面上元素的CSS属性,并且要真正获得元素的CSS属性值,您需要一个浏览器才能完全呈现页面和所有已定义的样式表
Scrapy本身不是浏览器,也不是JavaScript引擎,它无法呈现页面
有时候,CSS属性是在元素的style
属性中定义的。例如:
<span style="background-color: green"/>
在这种情况下,是的话,您可以使用style
属性值来过滤元素:
response.xpath("//span[contains(@style, 'background-color: green')]")
这将非常脆弱,并且可能会产生误报。
scrapy-splash
项目可让您自动化可能会渲染页面的轻量级Splash浏览器。在这种情况下,您需要执行一些Lua脚本来访问渲染页面上元素的CSS属性selenium
浏览器自动化工具可能是解决此问题的最直接的工具,因为它使您可以直接控制和访问页面及其元素及其属性和属性。存在.value_of_css_property()
method来获取CSS属性的值。 答案 1 :(得分:0)
Response.css()
是TextResponse.selector.css(query)
http://doc.scrapy.org/en/latest/topics/request-response.html#scrapy.http.TextResponse.css