把setting中的机器人过滤设为False

ROBOTSTXT_OBEY = False

1 语法

artcile

选取所有子节点

/article

选取根元素 artile

article/a

选取所有属于artile的子元素中的a元素

//div

选取所有 div 元素(不管出现在文档任何位置)

article//div

选取所有属于artile元素的后代的 div 元素,不管出现在 article 之下的任何位置

//@class

选取所有名为 class 的属性。

/article/div[1]

选取属于article子元素的第一个div元素

/article/div[last()]

选取属于article子元素的最后一个div元素

/article/div[last()-1]

选取属于article子元素的倒数第二个div元素

//div[@lang]

选取所有拥有lang属性的div元素

//div[@lang='eng']

选取所有lang属性为eng的div元素

debug

1 pycharm

id是全局唯一的

re_selector2 = response.xpath('//*[@id="post-110595"]/div[1]/h1/text()')

如果class='entry-header'是全局唯一,可以比上面少一层节点。

re_selector3 = response.xpath("//div[@class='entry-header']/h1/text()")

2 scrapy shell

对某一页http://blog.jobbole.com/110595/ 进行debug

scrapy shell http://blog.jobbole.com/110595/

得到response对象。

可以用dir(response)看属性和方法。用type(response)看类型。

>>> title = response.xpath("//div[@class='entry-header']/h1/text()")
>>> title
[<Selector xpath="//div[@class='entry-header']/h1/text()" data='为什么该和程序员约会?我有 20 个理由'>]

如何获取title中的数据?使用extract()方法,得到数组,再用序号可以得到具体值。

>>> title.extract()
['为什么该和程序员约会?我有 20 个理由']
>>> title.extract()[0]
'为什么该和程序员约会?我有 20 个理由'

不直接extra()是因为title 可以保持为selector对象。

获取时间,把里面的文本用text()获取出来。再用strip()默认出去默认字符。

>>> create_date = response.xpath("//p[@class='entry-meta-hide-on-mobile']/text()").extract()[0]
>>> create_date
'\r\n\r\n 2017/03/18 · '
>>> create_date = create_date.strip()
>>> create_date
'2017/03/18 ·'
>>> a = create_date.replace("·","").strip()
>>> a
'2017/03/18'
>>> b = create_date.strip("·")
>>> b
'2017/03/18 '
>>> b = create_date.strip("·").strip()
>>> b
'2017/03/18'

只取多个class属性中的一个,用xpath的函数 contains。

比如要选取span,但是class有多项。而只想要其中的vote-post-up,可以用xpath的contains。

<span data-post-id="" class=" btn-bluet-bigger href-style vote-post-up   register-user-only "><i class="fa  fa-thumbs-o-up"></i> <h10 id="110595votetotal">2</h10> 赞</span>
>>> response.xpath("//span[contains(@class, 'vote-post-up')]")
[<Selector xpath="//span[contains(@class, 'vote-post-up')]" data='<span data-post-id="110595" class=" btn-'>]

列表生成式

过滤评论

>>> response.xpath("//p[@class='entry-meta-hide-on-mobile']/a/text()").extract()[0:]
['其他', ' 7 评论 ', '约会']
>>> [element for element in tag_list if not element.strip().endswith("评论")]
['其他', '约会']
tag_list = [ element for element in tag_list if not element.strip().endswith("评论") ]
tags = ",".join(tag_list)

以什么结尾一定是 .endswith()

extract_first()

对数组取第0个、第1个的时候,如果数组为空,则可能抛出异常。

但是如果用extract_first(),不用做异常处理,结果为空或者None。

def extract_first(self, default=None):
for x in self:
return x.extract()
else:
return default

类似于字典的get方法,提取不到就返回空。

最终 jobbole.py

# -*- coding: utf-8 -*-
import re
import scrapy class JobboleSpider(scrapy.Spider):
name = "jobbole"
allowed_domains = ["blog.jobbole.com"]
start_urls = ['http://blog.jobbole.com/110595/'] def parse(self, response):
# re_selector1 = response.xpath("/html/body/div[1]/div[3]/div[1]/div[1]/h1")
# re_selector2 = response.xpath('//*[@id="post-110595"]/div[1]/h1/text()')
# re_selector3 = response.xpath("//div[@class='entry-header']/h1/text()")
title = response.xpath("//div[@class='entry-header']/h1/text()").extract()[0]
create_date = response.xpath("//p[@class='entry-meta-hide-on-mobile']/text()").extract()[0].strip().replace("·","").strip()
praise_nums = response.xpath("//span[contains(@class, 'vote-post-up')]//h10/text()").extract()[0]
fav_nums = response.xpath("//span[contains(@class, 'bookmark-btn')]/text()").extract()[0]
match_re = re.match(".*?(\d+).*", fav_nums)
if match_re:
fav_nums = match_re.group(1)
comment_nums = response.xpath("//a[@href='#article-comment']/span/text()").extract()[0]
match_re = re.match(".*?(\d+).*", comment_nums)
if match_re:
comment_nums = match_re.group(1) content = response.xpath("//div[@class='entry']").extract()[0]
tag_list = response.xpath("//p[@class='entry-meta-hide-on-mobile']/a/text()").extract()
tag_list = [ element for element in tag_list if not element.strip().endswith("评论") ]
tags = ",".join(tag_list) # 通过css选择器提取字段
title = response.css(".entry-header h1::text").extract()[0]
create_date = response.css(".entry-meta-hide-on-mobile::text").extract()[0].strip().replace("·","").strip()
praise_nums = response.css("div.post-adds h10::text").extract()[0] # fav_nums = response.css("span[class*='bookmark-btn']::text").extract()[0]
fav_nums = response.css(".bookmark-btn::text").extract()[0]
match_re = re.match(".*?(\d+).*", fav_nums)
if match_re:
fav_nums = match_re.group(1) # comment_nums = response.css("span[class='btn-bluet-bigger href-style hide-on-480']::text").extract()[0]
comment_nums = response.css("a[href='#article-comment'] span::text").extract_first()
match_re = re.match(".*?(\d+).*", comment_nums)
if match_re:
comment_nums = match_re.group(1)
content = response.css(".entry").extract()[0]
tag_list = response.css("p.entry-meta-hide-on-mobile a::text").extract()
tag_list = [element for element in tag_list if not element.strip().endswith("评论")]
tags = ",".join(tag_list)
pass

Spider-scrapy 中的 xpath 语法与调试的更多相关文章

  1. python在lxml中使用XPath语法进行#数据解析

    在lxml中使用XPath语法: 获取所有li标签: from lxml import etree html = etree.parse('hello.html') print type(html) ...

  2. 关于在scrapy中使用xpath

    1. 还是以虎嗅为例,他给我返回的是一个json格式的json串 2.那么我需要操作的就是把json串转换成我们的字典格式再进行操作 str=json.loads(response.body)['da ...

  3. [ 转 ] scrapy 中解决 xpath 中的中文编码问题

    1.问题描述: 实现定位<h2>品牌</h2>节点 brand_tag = sel.xpath("//h2[text()= '品牌']") 报错:Value ...

  4. scrapy中的xpath用法和css的用法

    css 不包含那个类 response.css(".list-left dd:not(.page)") 获取属性和文本 img.css("a::text").e ...

  5. XML 的 XPath 语法

    XPath 是 XML 路径语言(XML Path Language),用来确定XML文档中某部分位置的语言.无论是什么语言什么框架,几乎都可以使用 XPath 来高效查询 XML 文件. 本文将介绍 ...

  6. 在Scrapy中如何利用Xpath选择器从HTML中提取目标信息(两种方式)

    前一阵子我们介绍了如何启动Scrapy项目以及关于Scrapy爬虫的一些小技巧介绍,没来得及上车的小伙伴可以戳这些文章: 手把手教你如何新建scrapy爬虫框架的第一个项目(上) 手把手教你如何新建s ...

  7. python的scrapy框架的使用 和xpath的使用 && scrapy中request和response的函数参数 && parse()函数运行机制

    这篇博客主要是讲一下scrapy框架的使用,对于糗事百科爬取数据并未去专门处理 最后爬取的数据保存为json格式 一.先说一下pyharm怎么去看一些函数在源码中的代码实现 按着ctrl然后点击函数就 ...

  8. scrapy Selector用法及xpath语法

    准备工作 html示例: <?xml version="1.0" encoding="UTF-8"?> <html <head> ...

  9. XPath语法 在C#中使用XPath示例 【转http://www.cnblogs.com/yukaizhao/archive/2011/07/25/xpath.html】非常详细的文章

    XPath语法 在C#中使用XPath示例   XPath可以快速定位到Xml中的节点或者属性.XPath语法很简单,但是强大够用,它也是使用xslt的基础知识. 示例Xml: <?xml ve ...

随机推荐

  1. git修改push的注释信息

    修改还未push的注释: git commit --amend 修改后保存退出. 刚刚push到远端还没有人其他人下载或改动的: git commit --amend进入修改页面修改注释信息,修改后: ...

  2. C# System.IO 文件流输入输出

    一.读写文本文件 可以用fileStream来读写文本文件,但是FileStream是通过字节形式来读写数据的,要把字节数据转换为文本,要自己处理编码转换. 对于文本文件的读写,通常用 StreamR ...

  3. MyEclipse常用设置记录

    MyEclipse版本:MyEclipse 2014 Blue版本. 设置内容: 1.内存优化 <MyEclipse_ROOT>/myeclipse-blue.ini文件 主要修改-vma ...

  4. Latex排版工具的使用(一) 分类: Latex 2014-06-14 22:52 448人阅读 评论(0) 收藏

    使用Latex可以排版出漂亮的论文,尤其适合对含有数学公式论文的排版. 下面编写第一Latex源文件,实现对两个数学公式的排版: 新建文件first.tex: \documentclass{artic ...

  5. MVP架构模式

    概念解释 MVP是Model(数据) View(界面) Presenter(表现层)的缩写,它是MVC架构的变种,强调Model和View的最大化解耦和单一职责原则 Model:负责数据的来源和封装, ...

  6. Java 208道面试题及部分答案

    ---恢复内容开始--- 一.Java 基础 1.JDK 和 JRE 有什么区别? 答:JRE是java运行时环境,包含了java虚拟机,java基础类库.是使用java语言编写的程序运行所需要的软件 ...

  7. AJPFX学习Java函数知识总结

    函 数:为了提高代码的复用性,可以将其定义成一个单独的功能,该功能的体现就是java中的函数.函数就是体现之一. java中的函数的定义格式:         修饰符 返回值类型 函数名(参数类型 形 ...

  8. Thinkphp3.23 连接MSSQL方法

    Thinkphp 3.23要连接MSSQL,必须配置下,以下是主要的步骤. 1.要安装Microsoft Drivers for PHP for SQL Server驱动 下载驱动以前,要查看一下ph ...

  9. 支持中英文和国旗的android国家代码/国际电话区号选择器

    最近在做app登录的时候,因为需要支持国外手机号注册和登录,所以就涉及到国际电话区号的选择.在github上面找了一下,国家名称基本都是只有英文版本,而手动的去把中文一个个加上实在是一件费时费力的事情 ...

  10. 手动将Excel数据导入SQL

    1. 右键点击数据库名称,Tasks --> Import Data... 2. Choose Data Source:MicroSoft Excel,选择Excel文件和Excel版本.Exc ...