先上代码:

import scrapy
from scrapy.selector import Selector class QuoteSpider(scrapy.Spider):
name = "quotes"
start_urls = [
"http://quotes.toscrape.com/"
] def parse(self, response):
quotes = response.xpath("//div[@class='quote']")
for quote in quotes:
print(quote.xpath("//span[@class='text']/text()").extract_first())

再看看网页的结构

 
xpath-html.jpeg

我们自然想当然的以为,第一步xpath,将包含quote的所有div都找出来,然后遍历每一个div,再到每一个div中找到quote,这样打印出来的应该是当前页面所有的quote。Try it。

你会发现打印出来的都是第一个div里面的quote,这就是坑了。
我来试着解释一下,当前的代码处理xpath是分段处理了的,只要没有extract或者extract_first,xptah的处理都是一个整体,也就是说,循环里面的处理实际上是连接了上面的xpath处理,所以处理对象是整个response,这样每次取得就是第一条数据,那么如何实现我们想要的那种处理方式呢,先将xpath的数据extract出来,这样就是固定的区域了,然后再包装成Selector对象进行xpath处理,代码如下:

import scrapy
from scrapy.selector import Selector class QuoteSpider(scrapy.Spider):
name = "quotes"
start_urls = [
"http://quotes.toscrape.com/"
] def parse(self, response):
quotes = response.xpath("//div[@class='quote']").extract()
for quote in quotes:
print(Selector(text=quote).xpath("//span[@class='text']/text()").extract_first())

That's it.

作者:编程随想
链接:https://www.jianshu.com/p/e56e94e387f9
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

[Scrapy-6] XPath使用的一个坑的更多相关文章

  1. 使用scrapy中xpath选择器的一个坑点

    情景如下: 一个网页下有一个ul,这个ur下有125个li标签,每个li标签下有我们想要的 url 字段(每个 url 是唯一的)和 price 字段,我们现在要访问每个li下的url并在生成的请求中 ...

  2. scrapy初体验 - 安装遇到的坑及第一个范例

    scrapy,python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.scrapy用途广泛,可以用于数据挖掘.监测和自动化测试.scrapy的安装稍 ...

  3. 利用scrapy和MongoDB来开发一个爬虫

    今天我们利用scrapy框架来抓取Stack Overflow里面最新的问题(),并且将这些问题保存到MongoDb当中,直接提供给客户进行查询. 安装 在进行今天的任务之前我们需要安装二个框架,分别 ...

  4. #0 scrapy爬虫学习中遇到的坑记录

    python 基础学习中对于scrapy的使用遇到了一些问题. 首先进行的是对Amazon.cn的检索结果页进行爬取,很顺利,无碍. 下一个目标是对baidu的搜索结果进行爬取 1,反爬虫 1.1 我 ...

  5. 用html5的视频元素所遇到的第一个坑

    html5 有一个video标签,这个是被大家所熟知的事情.按照w3c的规范,我认真的写出如下代码: <video preload="auto" controls=" ...

  6. 监控jvm的一个坑

    监控jvm的一个坑 1,遇到的问题 我按照以往文档,在catalina.sh里追加jvm的监控api,如下 紧接着我启动 tomcat. 未报任何错误. 发现 lsof –i:12000, 12000 ...

  7. JavaScript中sort方法的一个坑(leetcode 179. Largest Number)

    在做 Largest Number 这道题之前,我对 sort 方法的用法是非常自信的.我很清楚不传比较因子的排序会根据元素字典序(字符串的UNICODE码位点)来排,如果要根据大小排序,需要传入一个 ...

  8. PHP中逻辑运算符and/or与||/&&的一个坑

    我原来以为PHP中的and和&&是一样的, 只是写法上为了可读性和美观, 事实上我错了. 这里面深藏了一个坑! 看以下代码: $bA = true; $bB = false; $b1  ...

  9. 困扰多日的C#调用Haskell问题竟然是Windows的一个坑

    最近一直被C#调用Haskell时的“尝试读取或写入受保护的内存”问题所困扰(详见C#调用haskell遭遇Attempted to read or write protected memory,C# ...

随机推荐

  1. NLP - Log-linear Models

    1.The Language Modeling Problem         现在抛开我们之前讲的马尔科夫模型的假设,对于一门语言的定义,肯定不能简单依赖于每个单词的前两个单词,这是常识.比如英语中 ...

  2. hadoop安装和环境配置---1

    一.安装java 1.下载 : yum install java-1.7.0-openjdk 2.配置环境变量 vim /etc/profile 要先看自己安装的java全名 然后再环境配置 expo ...

  3. 一百零四:CMS系统之修改邮箱界面

    在base.css中加一个全局的css控制宽度 .form-container{ width: 300px;} 视图 class ResetEmailView(views.MethodView): d ...

  4. keepalived+LVS-DR集群

    一.Keepalived介绍 keepalived 是一个类似于 layer3, 4 & 5 交换机制的软件,也就是我们平时说的第 3 层.第 4 层和第 5层交换. Keepalived 的 ...

  5. Redis 部署安装

    一.Redis介绍 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多 ...

  6. shell脚本:统计分析 /home/ 目录用户磁盘使用情况

    一.统计单台机器 /home/ 目录下磁盘空间使用 top3 的用户 common.sh 脚本用于统计 /home/* 目录下存储空间 top3 的用户. du -sb /home/* |sort - ...

  7. yii findAll方法

    $users = $this->user->find(array( 'select'=>array('id','username','email'), 'order' => ' ...

  8. svn clearup svn cleanup failed–previous operation has not finished; run cleanup if it was int错误的解决办法

    今天svn提交,出现异常:svn cleanup failed–previous operation has not finished; run cleanup if it was interrupt ...

  9. Java 基础篇之IO

    IO Java IO 流使用了一种装饰器设计模式,它将 IO 流分成底层节点流和上层处理流,其中节点流用于和物理节点直接关联,程序可以把不同物理节点流包装成统一的处理流,从而允许程序使用统一的输入.输 ...

  10. kubeadm快速安装k8s

    1.安装net-tools [root@localhost ~]# yum install -y net-tools 2.关闭firewalld [root@localhost ~]# systemc ...