和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'] 因为第一个节点包含子节点