和xpath类似,CSS在Response中也集成了。CSS选择器的语法更加简单,但是功能不如xpath强大。
CSS即层叠样式表。
语法
| 表达式 | 描述 | 例子 |
| * | 选中所有元素 | css('*') |
| Element | 选中Element元素 | css('img') |
| E1, E2 | 选中E1和E2元素 | css('div,p') |
| E1 E2 | 选中E1后代元素中的E2元素 | css('div input') |
| E1 > E2 | 选中E1子元素后的E2元素 | css('div > span') |
| E1 + E2 | 选中E1兄弟元素中的E2元素 | css('div + b') |
| .Class | 选中class属性包含Class的元素 | css('.info') |
| #id | 选中id属性为id的元素 | css('name') |
| [Attr] | 选中包含Attr属性的元素 | css('[id]') |
| [Attr = value] | 选中包含Attr属性且值为value的元素 | css("[class = 'name']") |
| [Attr ~= value] | 选中包含Attr属性且值包含value的元素 | css("[class ~= 'name']") |
| E:nth-child(n) | 选中E元素,且该元素必须是其父元素第n个子元素 | css("li:nth-child(2)") |
| E:nth-last-child(n) | 选中E元素,且该元素必须是其父元素倒数第n个子元素 | css("li:nth-last-child(2)") |
| E:first-child | 选中E元素,且该元素必须是其父元素第1个子元素 | css("li:first-child") |
| E:last-child | 选中E元素,且该元素必须是其父元素倒数第1个子元素 | css("li:last-child") |
| E:empty | 选中没有子元素的E元素 | css("div:empty") |
| E::text | 选中E元素的文本节点 | css("p::text") |
不难发现,其实和CSS的选择器有着一拼
案例
由于比较简单,和xpath类似,这里就举一个小案例:
from scrapy.selector import Selector
from scrapy.http import HtmlResponse
body = """
<ul>
<li class="name first"><b>Name</b></li>
<li class="sex">M</li>
<li class="age">23</li>
</ul>
"""
response = HtmlResponse(url='baiyazi.top', body=body, encoding='utf8')
a = response.css("li:nth-child(2)").extract()
#['<li class="sex">M</li>']
a = response.css("li[class ~= first]").extract()
#['<li class="name first"><b>Name</b></li>']
a = response.css("li::text").extract()
#['M', '23'] 因为第一个节点包含子节点