css选择器介绍
- 在css中选择器是一种模式,用于选择需要添加样式的元素,css对html页面中的元素实现一对一,一对多或者多对一的控制,都需要用到css选择器,html页面中的元素就是通过css选择器进行控制的;
css选择器的基本语法
-
类选择器:元素的class属性,比如
class="box"
表示选取class为box的元素; -
ID选择器:元素的id属性,比如
id="box"
表示选取id为box的元素; - 元素选择器:直接选择文档元素,比如p表示选择所有的p元素,div表示选择所有的div元素;
-
属性选择器:选择具有某个属性的元素,如
*[title]
表示选择所有包含title
属性的元素、a[href]
表示选择所有带有href属性的a元素等; -
后代选择器:选择包含元素后代的元素,如
li a
表示选取所有li 下所有a元素; -
子元素选择器:选择作为某元素子元素的元素,如
h1 > strong
表示选择父元素为h1 的所有 strong 元素; - 相邻兄弟选择器:选择紧接在另一元素后的元素,且二者有相同父元素,如h1 + p表示选择紧接在 h1 元素之后的所有p元素;
scrapy 中的css使用方法
以a元素来举例说明
-
response.css('a')
:返回的是selector对象; -
response.css('a').extract()
:返回的是a标签对象; -
response.css('a::text').extract_first()
:返回的是第一个a标签中文本的值; -
response.css('a::attr(href)').extract_first()
:返回的是第一个a标签中href属性的值; -
response.css('a[href*=image]::attr(href)').extract()
:返回所有a标签中href属性包含image的值; -
response.css('a[href*=image] img::attr(src)').extract()
:返回所有a标签下image标签的src属性;
- 上一节中我们使用XPATH选择器获取了csdn中今日推荐的标题,现在我们用CSS选择器来试着获取一下
# -*- coding: utf-8 -*-
import scrapy
class CsdnSpider(scrapy.Spider):
name = 'csdn'
allowed_domains = ['www.csdn.net']
start_urls = ['http://www.csdn.net/']
def parse(self, response):
result = response.css('.company_list .company_name a::text').extract()
for i in result:
print(i)
- 我们来看一下代码的运行结果,看是否能获取到我们想要的信息;
获取元素的跳转链接和图片地址
- 首先可以使用css选择器提取元素的跳转链接和图片的src地址,这里需要用到urllib库中的
parse.urljoin()
方法,用它来拼接获取到的元素中的路径,使之变为绝对路径;
urljoin(baes,url[,allow_frafments])
,其中参数base作为基地址,与第二个参数为相对路径的url相结合,组成一个绝对URl地址,其中参数allow_fragments可根据自己的需求设置;
import scrapy
from urllib import parse
class DribbbleSpider(scrapy.Spider):
name = 'dribbble'
allowed_domains = ['dribbble.com']
start_urls = ['http://dribbble.com/']
def parse(self, response):
a_href = response.css('.dribbble-shot .dribbble-over::attr(href)').extract_first("")
href = parse.urljoin(response.url, a_href)
print(a_href)
print(href)
import scrapy
from urllib import parse
class DribbbleSpider(scrapy.Spider):
name = 'dribbble'
allowed_domains = ['dribbble.com']
start_urls = ['http://dribbble.com/']
def parse(self, response):
image_src = response.css('img.enrique-image::attr(src)').extract_first("")
src = parse.urljoin(response.url, image_src)
print(image_src)
print(src)
- 下载且保存图片到本地
import scrapy
from urllib import parse
import requests
class DribbbleSpider(scrapy.Spider):
name = 'dribbble'
allowed_domains = ['dribbble.com']
start_urls = ['http://dribbble.com/']
def parse(self, response):
image_src = response.css('img.enrique-image::attr(src)').extract_first("")
src = parse.urljoin(response.url, image_src)
ret = requests.get(src, stream=True)
with open('./1.png', 'wb') as f:
for block in ret.iter_content(chunk_size=1024):
f.write(block)
如何快速获取页面中的元素
- 获取xpath选择器的元素:选择标签->鼠标右键->copy->Copy XPath;
- 获取css选择器的元素:可以使用第三方插件Chrome的开发者调试工具获取,需要下载CSS Select插件->然后直接选择标签元素;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。