原文学习链接:http://www.scrapyd.cn/doc/185.html

一. 标签属性值的提取

  • href的值URL的提取:这是最常见的,我们要进入下一页、或是打开内容页……都少不了URL值,如下面这段HTML,我们来提取一下里面的URL
<ol class="page-navigator">
<li class="current"><a href="http://lab.scrapyd.cn/page/1/">1</a></li>
<li><a href="http://lab.scrapyd.cn/page/2/">2</a></li>
<li><a href="http://lab.scrapyd.cn/page/3/">3</a></li>
<li><a href="http://lab.scrapyd.cn/page/4/">4</a></li>
</ol>

这其实是我们爬虫实验室的分页,如果我们要爬取下一页,我们该如何提取URL呢?提取属性我们是用:“标签名::attr(属性名)”,比如我们要提取url表达式就是:a::attr(href),要提取图片地址的表达式就是:img::attr(src)……以此类推,好了知道scrapy给我们提供的提取变了的工具,那我们就可以提取上面的URL了,有多种方式,首先我们可以直接:

response.css("a::attr(href)")

然后,我们调试一下,看是不是我们想要的结果,cmd输入:

scrapy shell lab.scrapy.cn

然后我们发现结果并非是我们想要的分页URL,而是页面中所有的URL:

Out[3]:
['http://lab.scrapyd.cn/',
'http://lab.scrapyd.cn/archives/57.html',
'http://lab.scrapyd.cn/tag/%E8%89%BA%E6%9C%AF/',
'http://lab.scrapyd.cn/tag/%E5%90%8D%E7%94%BB/',
……
'http://lab.scrapyd.cn/page/1/',
'http://lab.scrapyd.cn/page/2/',
……
'http://lab.scrapyd.cn/page/6/',
'http://lab.scrapyd.cn/page/2/',
'http://lab.scrapyd.cn/tag/%E4%BA%BA%E7%94%9F/',
……
'http://lab.scrapyd.cn/tag/%E5%90%8D%E7%94%BB/',
'http://lab.scrapyd.cn/tag/%E7%94%9F%E6%B4%BB/',
……
'http://lab.scrapyd.cn/']

这当然不是我们想要的,我们想要的只是分页的URL,那这要怎么办?那我们就需要限定一下我们URL的范围,最好的方法就是找到我们要提取目标最近的class或是id,可以看到这段代码中有个class="page-navigator",那我们就可以这样来写:

response.css(".page-navigator a::attr(href)").extract()

当这样限定之后,我们发现这就成功提取了我们想要的URL,灰常的完美!随便解释哈上面的:.page-navigator,其中点代表class选择器,如果代码中是:id=“page-navigator”,那我们这里就要写成:“#page-navigator”,大家如果不清楚可以去这里看看:https://www.runoob.com/css/css-id-class.html

  • img 的值 src 图片的提取:再来一个提取标签属性的栗子,最常见的就是我们的图片地址,也就是要提取图片的src值,如下面网页:
<article class="post" itemscope="" itemtype="http://schema.org/BlogPosting">
<h1 class="post-title" itemprop="name headline"><a itemprop="url" href="http://lab.scrapyd.cn/archives/57.html">中国传世名画</a></h1>
<div class="post-content" itemprop="articleBody">
<p>看官,此页面只为爬虫练习使用,都是残卷,若喜欢可以去找点高清版!</p>
<p><img src="http://lab.scrapyd.cn/usr/uploads/2018/02/3875934880.jpg" alt="1.jpg" title="1.jpg"></p>
<p><img src="http://lab.scrapyd.cn/usr/uploads/2018/02/2269613152.jpg" alt="2.jpg" title="2.jpg"></p>
<p><img src="http://lab.scrapyd.cn/usr/uploads/2018/02/2360992798.jpg" alt="3.jpg" title="3.jpg"></p>
<p><img src="http://lab.scrapyd.cn/usr/uploads/2018/02/2239103416.jpg" alt="4.jpg" title="4.jpg"></p>
<p><img src="http://lab.scrapyd.cn/usr/uploads/2018/02/4145232684.jpg" alt="5.jpg" title="5.jpg"></p>
</div>
<p itemprop="keywords" class="tags">标签: <a href="http://lab.scrapyd.cn/tag/%E8%89%BA%E6%9C%AF/">艺术</a>, <a href="http://lab.scrapyd.cn/tag/%E5%90%8D%E7%94%BB/">名画</a></p>
</article>

这个页面是我们爬虫实验室:http://lab.scrapyd.cn/archives/57.html的文章,我们要提取里面图片的地址供scrapy下载,有上面的基础就很简单了:首先找到隔img最近的class或id,可以看到有个:class="post-content",于是我们可以这样写表达式:

response.css(".post-content img::attr(src)").extract()

调试的话自己试哈,经过这个表达式:".post-content img::attr(src),可以看到已经成功提取出来:

Out[2]:
['http://lab.scrapyd.cn/usr/uploads/2018/02/3875934880.jpg',
'http://lab.scrapyd.cn/usr/uploads/2018/02/2269613152.jpg',
'http://lab.scrapyd.cn/usr/uploads/2018/02/2360992798.jpg',
'http://lab.scrapyd.cn/usr/uploads/2018/02/2239103416.jpg',
'http://lab.scrapyd.cn/usr/uploads/2018/02/4145232684.jpg']

好了上面便是提取标签属性的方法,利用的就是:标签名::attr(属性名),关键点就是如何缩小范围!

二、标签内容的提取

什么是标签内容,比如:

<p>scrapy中文网</p>

<div>scrapy中文网:www.scrapyd.cn</div>

<h1>scrapy实验室:lab.scrapyd.cn</h1>

<title>scrapy中文网</title>

上面标签:p、div、h1里面的文字便是标签内容,那我们要如何提取呢?用到了scrapy给我提供的这么一个方法:“::text”,比如要提取上面p标签里面的内容,我们可以这样:

response.css("p::text").extract()

那接下来我们就演示哈如何提取scrapy中文网:http://www.scrapd.cn的title:

<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Scrapy 中文网</title>
……

提取方式:

response.css("title::text").extract()

上面的这个栗子灰常简单,应为tittle标签是页面唯一的标签,所以在title前不用加什么限制,当你发现标签不唯一的时候,我们就需要缩小范围,原理和上面标签属性提取一样,要么找最近的class、要么找最近的id,然后最终缩小提取访问,这样就能让提取很准确,如下面这个例子:

<div class="left">
scrapy中文网左边
</div> <div class="center">
scrapy中文网中部
</div> <div class="right">
scrapy中文网右侧
</div>

如果我们要提取第二个div里面的内容,我们肯定不能这样:

 response.css("div::text").extract()

如果这样提取的话,我们肯定得不到正确的结果,我们还需要限制哈范围,找到最近的class=“center”,最终表达式如下:

response.css(".center::text").extract()

这样的话就能正确提取我们想要的内容;下面我们再介绍一个最常用的提取方式:含有嵌套标签文字的提取,HTML如下:

<div class="post-content" itemprop="articleBody">
<p>如果你因失去了太阳而流泪,那么你也将失去群星了。 <br>
If you shed tears when you miss the sun, you also miss the stars.
</p>
<p>
<a href="http://www.scrapyd.cn">scrapy中文网(</a><a href="http://www.scrapyd.cn">http://www.scrapyd.cn</a>)整理
</p>
</div>

如果我们要提取class=“post-content”里面的所有文字,我们需要怎么办呢?显然上面的知识无法做到。这段文字是scrapy实验室:http://lab.scrapyd.cn/archives/28.html 里的文章,诸位可以scrapy shell进行验证结果,可以记住用下面的方式:

response.css(".post-content *::text").extract()

可以看到,“::tex“t前面有个“*”号,这是一个小技巧,一般人我都告诉他,学着点!好了,上面的一些常见的内容已经说了些;接下来我们来说一些比较复杂的表达式,大家根据情况使用:

、CSS 高级用法(来源:菜鸟教程):

CSS选择器用于选择你想要的元素的样式的模式。"CSS"列表示在CSS版本的属性定义(CSS1,CSS2,或对CSS3)。

选择器 示例 示例说明 CSS
.class .intro 选择所有class="intro"的元素 1
#id #firstname 选择所有id="firstname"的元素 1
* * 选择所有元素 2
element p 选择所有<p>元素 1
element,element div,p 选择所有<div>元素和<p>元素 1
element element div p 选择<div>元素内的所有<p>元素 1
element>element div>p 选择所有父级是 <div> 元素的 <p> 元素 2
element+element div+p 选择所有紧接着<div>元素之后的<p>元素 2
[attribute] [target] 选择所有带有target属性元素 2
[attribute=value] [target=-blank] 选择所有使用target="-blank"的元素 2
[attribute~=value] [title~=flower] 选择标题属性包含单词"flower"的所有元素 2
[attribute|=language] [lang|=en] 选择一个lang属性的起始值="EN"的所有元素 2
:link a:link 选择所有未访问链接 1
:visited a:visited 选择所有访问过的链接 1
:active a:active 选择活动链接 1
:hover a:hover 选择鼠标在链接上面时 1
:focus input:focus 选择具有焦点的输入元素 2
:first-letter p:first-letter 选择每一个<P>元素的第一个字母 1
:first-line p:first-line 选择每一个<P>元素的第一行 1
:first-child p:first-child 指定只有当<p>元素是其父级的第一个子级的样式。 2
:before p:before 在每个<p>元素之前插入内容 2
:after p:after 在每个<p>元素之后插入内容 2
:lang(language) p:lang(it) 选择一个lang属性的起始值="it"的所有<p>元素 2
element1~element2 p~ul 选择p元素之后的每一个ul元素 3
[attribute^=value] a[src^="https"] 选择每一个src属性的值以"https"开头的元素 3
[attribute$=value] a[src$=".pdf"] 选择每一个src属性的值以".pdf"结尾的元素 3
[attribute*=value] a[src*="runoob"] 选择每一个src属性的值包含子字符串"runoob"的元素 3
:first-of-type p:first-of-type 选择每个p元素是其父级的第一个p元素 3
:last-of-type p:last-of-type 选择每个p元素是其父级的最后一个p元素 3
:only-of-type p:only-of-type 选择每个p元素是其父级的唯一p元素 3
:only-child p:only-child 选择每个p元素是其父级的唯一子元素 3
:nth-child(n) p:nth-child(2) 选择每个p元素是其父级的第二个子元素 3
:nth-last-child(n) p:nth-last-child(2) 选择每个p元素的是其父级的第二个子元素,从最后一个子项计数 3
:nth-of-type(n) p:nth-of-type(2) 选择每个p元素是其父级的第二个p元素 3
:nth-last-of-type(n) p:nth-last-of-type(2) 选择每个p元素的是其父级的第二个p元素,从最后一个子项计数 3
:last-child p:last-child 选择每个p元素是其父级的最后一个子级。 3
:root :root 选择文档的根元素 3
:empty p:empty 选择每个没有任何子级的p元素(包括文本节点) 3
:target #news:target 选择当前活动的#news元素(包含该锚名称的点击的URL) 3
:enabled input:enabled 选择每一个已启用的输入元素 3
:disabled input:disabled 选择每一个禁用的输入元素 3
:checked input:checked 选择每个选中的输入元素 3
:not(selector) :not(p) 选择每个并非p元素的元素 3
::selection ::selection 匹配元素中被用户选中或处于高亮状态的部分 3
:out-of-range :out-of-range 匹配值在指定区间之外的input元素 3
:in-range :in-range 匹配值在指定区间之内的input元素 3
:read-write :read-write 用于匹配可读及可写的元素 3
:read-only :read-only 用于匹配设置 "readonly"(只读) 属性的元素 3
:optional :optional 用于匹配可选的输入元素 3
:required :required 用于匹配设置了 "required" 属性的元素 3
:valid :valid 用于匹配输入值为合法的元素 3
:invalid :invalid 用于匹配输入值为非法的元素

3

Scrapy css选择器提取数据的更多相关文章

  1. Spider-Scrapy css选择器提取数据

    首先我们来说说css选择器:其实在上面的概述:和scrapy相关的函数就这么三个而已:response.css("css表达式").extract().extract_first( ...

  2. scrapy框架Selector提取数据

    从页面中提取数据的核心技术是HTTP文本解析,在python中常用的模块处理: BeautifulSoup  非常流行的解析库,API简单,但解析的速度慢. lxml 是一套使用c语言编写的xml解析 ...

  3. scrapy 中用selector来提取数据的用法

      一. 基本概念 1. Selector是一个可独立使用的模块,我们可以用Selector类来构建一个选择器对象,然后调用它的相关方法如xpaht(), css()等来提取数据,如下 from sc ...

  4. 使用 CSS 选择器从网页中提取数据

    在 R 中,关于网络爬虫最简单易用的扩展包是 rvest.运行以下代码从 CRAN 上安装:install.packages("rvest")首先,加载包并用 read_html( ...

  5. 初始scrapy,简单项目创建和CSS选择器,xpath选择器(1)

    一 安装 #Linux: pip3 install scrapy #Windows: a. pip3 install wheel b. 下载twisted http://www.lfd.uci.edu ...

  6. 在scrapy中利用Selector来提取数据

    1.创建对象 Selector类的实现位于scrapy.selector模块,创建Selector对象的时候,可以将页面的Html文档字符串传递给Selector构造器方法 2.选中数据 调用Sele ...

  7. 第三百四十节,Python分布式爬虫打造搜索引擎Scrapy精讲—css选择器

    第三百四十节,Python分布式爬虫打造搜索引擎Scrapy精讲—css选择器 css选择器 1. 2. 3.  ::attr()获取元素属性,css选择器 ::text获取标签文本 举例: extr ...

  8. 十九 Python分布式爬虫打造搜索引擎Scrapy精讲—css选择器

    css选择器 1. 2. 3.  ::attr()获取元素属性,css选择器 ::text获取标签文本 举例: extract_first('')获取过滤后的数据,返回字符串,有一个默认参数,也就是如 ...

  9. scrapy xpath、正则表达式、css选择器

    scrapy xpath XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言.XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力. 学习 ...

  10. 2017年3月1日09:45:39 css选择器,session数据取不到

    昨天碰到了一个问题,通过输入指定的url进行登录在服务端将url存在session中但是登陆之后因为页面提交的登录请求是ajax请求,在后端提取session时获取不当之前存的url,老司机说不是同一 ...

随机推荐

  1. kali 安装 shodan

    声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无 ...

  2. 华为云云日志服务 HarmonyOS NEXT采集最佳实践

    鸿蒙背景介绍 华为鸿蒙HarmonyOS系统是面向万物互联的全场景分布式操作系统,支持手机.平板.智能穿戴.智慧屏等多种终端设备运行,提供应用开发.设备开发的一站式服务的平台.2024 年 1 月 1 ...

  3. 利用smtp发邮件

    小功能,备忘 MailMessage objMailMessage = new MailMessage();//引入System.Net objMailMessage.From = new MailA ...

  4. 渗透测试-前端加密分析之AES

    前言 本文是高级前端加解密与验签实战的第3篇文章,本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本文讲述的是绕过前端 AES(CBC) 和 AES(ECB) 加密. 因为编写Yakit热 ...

  5. 07C++选择结构(1)——教学

    一.基础知识 1.关系运算符 因为我们要对条件进行判断,必然会用到关系运算符: 名称 大于 大于等于 小于 小于等于 等于 不等于 符号 > >= < <= == != 关系表 ...

  6. django生命周期流程图与django路由层

    目录 一.django请求生命周期流程图 二.django路由层 1.路由匹配 2.转换器 3.正则匹配 不同版本的区别 正则匹配斜杠导致的区别 4.正则匹配的无名有名分组 分组匹配 无名分组 有名分 ...

  7. 【Java高级编程】IO流学习笔记

    目录 IO流 File类 文件/文件夹基础操作 创建文件的完整步骤 IO流 - 节点流 读入文件一个字节(一个字节) [FileInputStream]字节数组的方式读取(读取全部内容) [FileI ...

  8. Qt可视化大屏电子看板系统全平台效果图

  9. FFmpeg中的色彩空间与像素格式3-像素格式

    FFmpeg 中的色彩与像素系列文章如下: [1]. FFmpeg中的色彩空间与像素格式1-色彩空间基础 [2]. FFmpeg中的色彩空间与像素格式2-RGB/YUV色彩空间 [3]. FFmpeg ...

  10. 开源即时通讯IM框架MobileIMSDK的鸿蒙NEXT端开发快速入门

     相关链接: ① MobileIMSDK-鸿蒙端的详细介绍 ② MobileIMSDK-鸿蒙端的开发手册new(* 精编PDF版) 一.理论知识准备 您需要对鸿蒙Next和ArkTS开发有所了解: 1 ...