这个章节介绍除Xpath外另一种常用的数据提取方式: CSS选择器
CSS即层叠样式表,其选择器是一种用来确定HTML文档中某部分位置的语言,相对于Xpath更简单一些,但功能不如xpath强大。
通过以下例子展示css选择器的使用。
from scrapy.selector import Selector
from scrapy.http import HtmlResponse
body = """
<!DOCTYPE html>
<html>
<head>
<title>lianxi</title>
</head>
<body>
<div id="images-1" style="width: 1230px;">
<a href="image1.html">Name:Image1</br><img src="image1.jpg"></a>
<a href="image2.html">Name:Image2</br><img src="image2.jpg"></a>
<a href="image3.html">Name:Image3</br><img src="image3.jpg"></a>
</div>
<div id="images-2" class="small">
<a href="image4.html">Name:Image4</br><img src="image4.jpg"></a>
<a href="image5.html">Name:Image5</br><img src="image5.jpg"></a>
</div>
</body>
</html>
"""
# 创建一个HTML文档并构造一个HTMLresponse对象
response = HtmlResponse(url="http://www.example.com", body=body, encoding="utf-8")
# 1:选取所有E元素
print(response.css("img"))
# 2:选取所有E1和E2元素
print(response.css("base, title"))
# 3:选取E1后代元素中的E2元素
print(response.css("div img"))
# 4:选取E1子元素中的E2元素
print(response.css("body>div"))
# 5:选取包含ATTR属性的元素
# 选中包含style属性的元素
print(response.css("[style]"))
# 6:选取包含ATTR属性且值为value的元素
# 选取属性id为images-1的元素
print(response.css("[id=images-1]"))
# 7:nth-child(n):选取E元素,且该元素必须是其父元素的第n个子元素
# 选取每个div中的第一个a
print(response.css("div>a:nth-child(1)"))
# 选取第二个div中的第一个a
print(response.css("div:nth-child(2)>a:nth-child(1)"))
# 8:E:first-child(): 选中E元素,该元素必须是其父元素的第一个元素
# E:last-child(): 选中E元素,该元素必须是其父元素的倒数第一个元素
# 选取第一个div的最后一个a
print(response.css("div:first-child>a:last-child"))
# 9:选取E元素的文本节点
# 选取所有的a文本
print(response.css("a::text"))