Spider-scrapy 中的 xpath 语法与调试
把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 语法与调试的更多相关文章
- python在lxml中使用XPath语法进行#数据解析
在lxml中使用XPath语法: 获取所有li标签: from lxml import etree html = etree.parse('hello.html') print type(html) ...
- 关于在scrapy中使用xpath
1. 还是以虎嗅为例,他给我返回的是一个json格式的json串 2.那么我需要操作的就是把json串转换成我们的字典格式再进行操作 str=json.loads(response.body)['da ...
- [ 转 ] scrapy 中解决 xpath 中的中文编码问题
1.问题描述: 实现定位<h2>品牌</h2>节点 brand_tag = sel.xpath("//h2[text()= '品牌']") 报错:Value ...
- scrapy中的xpath用法和css的用法
css 不包含那个类 response.css(".list-left dd:not(.page)") 获取属性和文本 img.css("a::text").e ...
- XML 的 XPath 语法
XPath 是 XML 路径语言(XML Path Language),用来确定XML文档中某部分位置的语言.无论是什么语言什么框架,几乎都可以使用 XPath 来高效查询 XML 文件. 本文将介绍 ...
- 在Scrapy中如何利用Xpath选择器从HTML中提取目标信息(两种方式)
前一阵子我们介绍了如何启动Scrapy项目以及关于Scrapy爬虫的一些小技巧介绍,没来得及上车的小伙伴可以戳这些文章: 手把手教你如何新建scrapy爬虫框架的第一个项目(上) 手把手教你如何新建s ...
- python的scrapy框架的使用 和xpath的使用 && scrapy中request和response的函数参数 && parse()函数运行机制
这篇博客主要是讲一下scrapy框架的使用,对于糗事百科爬取数据并未去专门处理 最后爬取的数据保存为json格式 一.先说一下pyharm怎么去看一些函数在源码中的代码实现 按着ctrl然后点击函数就 ...
- scrapy Selector用法及xpath语法
准备工作 html示例: <?xml version="1.0" encoding="UTF-8"?> <html <head> ...
- XPath语法 在C#中使用XPath示例 【转http://www.cnblogs.com/yukaizhao/archive/2011/07/25/xpath.html】非常详细的文章
XPath语法 在C#中使用XPath示例 XPath可以快速定位到Xml中的节点或者属性.XPath语法很简单,但是强大够用,它也是使用xslt的基础知识. 示例Xml: <?xml ve ...
随机推荐
- apicloud运行机制
1 首先在官网apicloud中,创建项目生成config.xml文件,预设风格. 2 将config.xml文件放在项目跟目录中,Vue项目,必须先打包生产dist文件, 3 本地或者云编译(官方工 ...
- 重置iptables
# reset the default policies in the filter table.iptables -P INPUT ACCEPTiptables -P FORWARD ACCEPTi ...
- 暴力 hihoCoder 1178 计数
题目传送门 /* 暴力:这题真是醉了,直接暴力竟然就可以了!复杂度不会分析,不敢写暴力程序.. 枚举x,在不重复的情况下+ans,超过范围直接break */ #include <cstdio& ...
- 题解报告:poj 2689 Prime Distance(区间素数筛)
Description The branch of mathematics called number theory is about properties of numbers. One of th ...
- Create the first sql server 2016 mobile report;创建 第一个 sqlserver 2016 Mobile report
在微软收购了datazen之后,sqlserver2016 集成了mobilereport,mobile report 基于html5,兼容各类主流浏览器,之前ssrs2008 R2中很多chart类 ...
- VS2010中使用命令行参数 分类: c/c++ 2014-07-11 22:24 634人阅读 评论(0) 收藏
在Linux下编程习惯了使用命令行参数,故使用VS2010时也尝试了一下. 新建项目,c++编写程序如下: #include<iostream> #include<fstream&g ...
- Join方法,yield方法,线程的优先级
- android开发学习 ------- 【转】Gradle相关
一直在用AndroidStudio,但是对于其Gradle了解的很少. 推荐 http://www.jianshu.com/p/9df3c3b6067a 觉得说的很棒!
- android开发学习——android studio 引入第三方库的总结
http://www.jianshu.com/p/0c592fff5d89 总结的很溜
- poj3040 Allowance
思路: 贪心. 看了题解说是 先把面值从大到小排序然后从头往尾扫,只要不超额,能取多少去多少然后如果还有剩余,就从尾往头扫,尽量取,让他恰好超额 不过并不懂证明. 实现: #include <i ...