是否可以通过Scrapy中的CSS属性定位元素?

时间:2014-09-24 22:53:26

标签: python html css scrapy

我想知道Scrapy是否有基于CSS中定义的颜色来刮取数据的方法。例如,选择background-color: #ff0000的所有元素。

我试过这个:

response.css('td::attr(background-color)').extract()

我期待一个列表,其中包含为表数据元素设置的所有背景颜色,但它返回一个空列表。

通常可以在Scrapy中通过CSS属性定位元素吗?

2 个答案:

答案 0 :(得分:13)

最简单的答案是,仅凭Scrapy不可能做到这一点。

为什么不呢?

  • 使用:attr()选择器可以访问元素属性,但是background-colorCSS 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

相关问题