scrapy实战2,使用内置的xpath,re和css提取值
import scrapy class JobboleSpider(scrapy.Spider):
name = 'jobbole'
allowed_domains = ['blog.jobbole.com']
start_urls = ['http://blog.jobbole.com/'] def parse(self, response):
re_selector = response.xpath('//*[@id="post-110287"]/div[1]/h1/text()')
<html><body><div>
<ul>
<li class="item-0"><a href="link1.html"><span>first item</span></a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div></body></html>
首先选中href属性为link4.html的a节点,然后再获取其父节点,然后再获取其class属性
result1 = response.xpath('//a[@href="link4.html"]/../@class')
我们也可以通过parent::来获取父节点
result2 = response.xpath('//a[@href="link4.html"]/parent::*/@class')
获取class为item-1的li节点文本,
result3 = response.xpath('//li[@class="item-0"]/a/text()')
返回结果为['first item', 'fifth item']
获取所有li节点下的所有a节点的href属性
result4 = response.xpath('//li/a/@href')
返回结果为['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']
result = response.xpath('//li[1]/a/text()') #选取第一个li节点
result = response.xpath('//li[last()]/a/text()') #选取最后一个li节点
result = response.xpath('//li[position()<3]/a/text()') #选取位置小于3的li节点,也就是1和2的节点
result = response.xpath('//li[last()-2]/a/text()') #选取倒数第三个节点
)返回第一个li节点的所有祖先节点,包括html,body,div和ul
result = response.xpath('//li[1]/ancestor::*') )返回第一个li节点的<div>祖先节点
result = response.xpath('//li[1]/ancestor::div') )返回第一个li节点的所有属性值
result = response.xpath('//li[1]/attribute::*') )首先返回第一个li节点的所有子节点,然后加上限定条件,选组href属性为link1.html的a节点
result = response.xpath('//li[1]/child::a[@href="link1.html"]') )返回第一个li节点的所有子孙节点,然后加上只要span节点的条件
result = response.xpath('//li[1]/descendant::span') )following轴可获得当前节点之后的所有节点,虽然使用了*匹配,但是又加了索引选择,所以只获取第2个后续节点,也就是第2个<li>节点中的<a>节点
result = response.xpath('//li[1]/following::*[2]') )following-sibling可获取当前节点之后的所有同级节点,也就是后面所有的<li>节点
result = response.xpath('//li[1]/following-sibling::*')
<li class="li li-first"><a href="link.html">first item</a></li>
result5 = response.xpath('//li[@class="li"]/a/text()')
返回值为空,因为这里HTML文本中li节点为class属性有2个值li和li-first,如果还用之前的属性匹配就不行了,需要用contain()函数
正确方法如下
result5 = response.xpath('//li[contains(@class, "li")]/a/text()')
contains()方法中,第一个参数为属性名,第二个参数传入属性值,只要此属性名包含所传入的属性值就可完成匹配
from lxml import etree
text = '''
<li class = "li li-first" name="item"><a href="link.html">first item</a></li>
'''
html = etree.HTML(text)
result6 = html.xpath('//li[contains(@class, "li") and @name="item"]/a/text()')
print(result)
>>> title = response.xpath('//div[@class="entry-header"]/h1/text()')
>>> title
[<Selector xpath='//div[@class="entry-header"]/h1/text()' data='2016 腾讯软件开发面试题(部分)'>]
>>> title.extract()
['2016 腾讯软件开发面试题(部分)']
>>> title.extract()[]
'2016 腾讯软件开发面试题(部分)'
>>> title.extract_first()
'2016 腾讯软件开发面试题(部分)'
>>> response.xpath("//p[@class='entry-meta-hide-on-mobile']/text()").extract()[].strip().replace("·","").strip()
'2017/02/18'
>>> response.xpath("//span[contains(@class, 'vote-post-up')]/h10/text()").extract()
['']
>>> response.xpath("//span[contains(@class, 'vote-post-up')]/h10/text()").extract()[]
''
>>> int(response.xpath("//span[contains(@class, 'vote-post-up')]/h10/text()").extract()[])
>>> response.xpath("//span[contains(@class, 'bookmark-btn')]/text()").extract()[]
' 28 收藏'
>>> string = response.xpath("//span[contains(@class, 'bookmark-btn')]/text()").extract()[]
>>> import re
>>> pattern = re.match(".*?(\d+).*", string)
>>> pattern.group()
''
可以简写为
>>> response.xpath("//span[contains(@class, 'bookmark-btn')]/text()").re('.*?(\d+).*')
['']
>>> response.xpath("//span[contains(@class, 'bookmark-btn')]/text()").re('.*?(\d+).*')[0]
''
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMQAAAAhCAYAAACGLwRaAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAASXSURBVHhe7Zc9UiRJDEb3/jfAxsbFxeYAHIETQOBBb7zZeRPfqpVVXd3Lzhh6ERlVnaWUPiml+fnrNAzDL2YghiGYgRiGYAZiGIIZiGEIZiCGIZiBGIZgBmIYghmIYQhmIG7k6enpdHd396/1+Ph4ur+/P9t/eXn5eer04zs8Pz+f2bm+C/S9vr7+eN+KnxpZFc9eS423tahd6q5wD97FLbQDkZf58PDwc/cfsgHqN7BIKVz7umpy+NYnBUjbpDZhVyTPJ/zmbMLZ9JVNeyk2Dr7U755wmd1AVMyty2mPmsuWD75XUn8FvenPWOitNb0WatQNXrLKCw2cpcarHC7hbCBwXC/OhAmYF5nfLBBJ7V0GZ7Cr4I/Y+tIHtibJXp7FV2oSbNTGWbW5J5z1EoiN3VGMj7a9geBJDFc2gBqvhfPeXb2rilqwyzvMZsrz9VvGYt/3IxDbOmytrAlx0NvZ5bpGD+z+k4ngCiLxvMBV0RFkM1fY53uFBPSVMcEznc+Vv84en3Ugqt0qzhbo5hxrbyAkv/ONs7fAXWTDAjEuaQzOkTNLH2jKuxZs0Fr9stfZb4G991HjWR/2+LYHfo7G79gdCAqk6Fpgi1Nhb9VUJFebEnK/s1ldLkXI5gL2anNA5zf3Li1+xfjZUFUTfruBICb16tYRLV3O/GY/QYP+1cOTWOr3t9+0p048V5BTjbcFtnnnxmFlfayd3zrS1y1sDgRC8mJ5t4hwdCBW9pBniFuTq7HBItX9rhGg84sdPlyronK2NpxYIxsK2Eu/rNSZdQV/Y0MsG6Gy0mFtjWFtujqAjZ+k/kraq1Hq78pKB3s5EGljPWod3K/1xeZbB8IgCSKyiKsGZ8/mTlaiSTovorOrsbHpYq80QfWLv6qV3xlHOLtqlrwcbbw44Xz6ze/sew59NkpXqy0d5qMOVpcL8I042q+WGtIXT3SAuXdahe/Z7GKegL+0sT7sGQtWdUtNt3A2EDZUV0iLKLwrKOF8NxCr/eqXImVytcmxXyVfzybs58V1+qvNJXhJ6Ozq0UE+LDRw3nqbJxqO6qhkzSrorHe8pT/teaZ+OJK7cNYcqbs+WXsDwTl0ZMwclms5G4ithvDyhHcLkpBQbXzEd4K7fQdAH2iyKCs/0sWWmpsXm/b8Zv8I6uHJeWO4z6VZJzSkDd98T31V61H2ztvg2Al1WDV12tdz0O3tUQcie8nasZd+2VcLK/XyjRzw2fXlJZwNBAG4sFyKA8S5vyo432pTYtsVjL3ODwkZJ5PO/VwUh29pW+liVX9HC5n1yAviyW/xspLUw3tq5/2oFmKoBX9b4F/NsjcQ2rOqf/Lo7nGL1V3WlbHI0TjoSBs18J55HWHzP9X/ByRTG+Varmmi/xIbqtPBt/yDJeESbcRs6u+kq/vWQFQ9asx1FGq0N0TYOBCpzzrVOvP9Gi3yWwciG+FW/NNiGG7ht/8NMQx/EjMQwxDMQAxDMAMxDMEMxDAEMxDDEMxADEMwAzEMwQzEMARnA/H29jbPK57v7++nr6+veR58fnx8nD4/P/+Y5/wNMQzBDMQw/OJ0+hsJCgRPORKLUQAAAABJRU5ErkJggg==" alt="" />找到不是以"评论"结尾的元素
>>> response.xpath("//p[@class='entry-meta-hide-on-mobile']/a/text()").extract()
['职场', ' 9 评论 ', '面试']
>>> tag_list = response.xpath("//p[@class='entry-meta-hide-on-mobile']/a/text()").extract()
>>> [element for element in tag_list if not element.strip().endswith("评论")]
['职场', '面试']
>>> tag_choose=[element for element in tag_list if not element.strip().endswith("评论")]
>>> tags=",".join(tag_choose)
>>> tags
'职场,面试'
|
li a
|
选取所有li下的所有a节点
|
|
ul + p
|
选择ul后面的第一个p元素,ul和p是兄弟节点
|
|
div#container>ul
|
选取id为container的div标签,下边的第一个ul子元素
|
|
ul ~ p
|
选取与ul相邻的所有p元素
|
|
a[title]
|
选取所有含有title属性的a元素
|
|
a::attr(href)
|
获取所有a元素的href属性值
|
|
a[href="http://jobbole.com"]
|
选取所有href属性为http://jobbole.com值的a元素
|
|
a[href*="jobble"]
|
选取所有href属性包含jobbole的a元素
|
|
a[href^="http"]
|
选取所有href属性值以http开头的a元素
|
|
a[href$=".jpg"]
|
选取所有href属性值以.jpg结尾的a元素
|
|
input[type=radio]:checked
|
选择选中的radio的元素
|
|
div:not(#container)
|
选取所有id不等于container的div元素
|
|
li:nth-child(3)
|
选取第三个li元素
|
|
tr:nth-child(2n)
|
选取偶数位的tr元素
|
>>> response.css(".entry-header h1").extract()
['<h1>2016 腾讯软件开发面试题(部分)</h1>']
>>> response.css(".entry-header h1::text").extract()[]
'2016 腾讯软件开发面试题(部分)'
>>> response.css("p.entry-meta-hide-on-mobile::text").extract()[].strip().replace(" ·","")
'2017/02/18'
>>> response.css(".vote-post-up h10::text").extract()[]
''
>>> response.css(".bookmark-btn::text").extract()[]
' 28 收藏'
>>> string = response.css(".bookmark-btn::text").extract()[]
>>> tag=re.match(".*?(\d+).*", string)
>>> tag.group()
''
其实正则re也是scrapy的内置模块,可以简写为如下
>>> response.css(".bookmark-btn::text").re('.*?(\d+).*')
['']
>>> response.css(".bookmark-btn::text").re('.*?(\d+).*')[0]
''
response.css("div.entry").extract()[]
>>> response.css("p.entry-meta-hide-on-mobile a::text").extract()
['职场', ' 9 评论 ', '面试']
scrapy实战2,使用内置的xpath,re和css提取值的更多相关文章
- 《Python高效开发实战》实战演练——内置Web服务器4
<Python高效开发实战>实战演练——开发Django站点1 <Python高效开发实战>实战演练——建立应用2 <Python高效开发实战>实战演练——基本视图 ...
- Spring Cloud Gateway实战之五:内置filter
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Scrapy框架学习 - 使用内置的ImagesPipeline下载图片
需求分析需求:爬取斗鱼主播图片,并下载到本地 思路: 使用Fiddler抓包工具,抓取斗鱼手机APP中的接口使用Scrapy框架的ImagesPipeline实现图片下载ImagesPipeline实 ...
- Scrapy爬虫框架(2)--内置py文件
Scrapy概念图 这里有很多py文件,分别与Scrapy的各个模块对应 superspider是一个爬虫项目 spider1.py则是一个创建好的爬虫文件,爬取资源返回url和数据 items.py ...
- Spring Cloud Gateway实战之四:内置predicate小结
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Jmeter学习笔记(二十)——后置处理器XPath Extractor使用
一.背景 在使用过程某些操作步骤与其相邻步骤存在一定的依赖关系,需要需要将上一个请求的响应结果作为下一个请求的参数. Jmeter中后置处理器正则表达式提取器和XPath Extractor都可以将页 ...
- Python第八天 模块 包 全局变量和内置变量__name__ Python path
Python第八天 模块 包 全局变量和内置变量__name__ Python path 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Pyt ...
- python 数据类型元组与字典内置方法
1.元组 (1)元组是不可变的列表,能存多个值:如果多个值只有取得需求,没有改的需求,用元组最合理 (2)定义:在()内用逗号隔开,可以存任意类型的值 注意:当元组只有一个元素时,要在后面加逗号 # ...
- python成长之路八 -- 内置函数
1,python内置函数 内置函数 abs() dict() help() min() setattr() all() dir() hex() next() slice() a ...
随机推荐
- 基于分布式思想下的RPC解决方案--笔记
分布式: RPC可以提高系统稳定性,比如说,我们的订单服务程序更新出BUG,导致内存溢出,是这台服务器宕机了,但是它只会影响的整个系统的订单业务部分,对于用户注册登录等业务没有影响,同样对于系统的日志 ...
- PLSQL启动很慢的问题
最近重新做了系统,win7 64位系统上装了oracle10g,plsql10.发现plsql启动比较慢. 解决方法: 首先停止打印机服务:Print Spooler,然后将这个服务设置为手动模式.
- WHY JAVASCRIPT NEEDS TYPES
Types have a bad reputation for making code harder to read, adding unnecessary ceremony, and in gene ...
- android studio快捷键大全
----常用快捷键 1.Ctrl+E,可以显示最近编辑的文件列表 2.Shift+Click可以关闭文件 3.Ctrl+[或]可以跳到大括号的开头结尾 4.Ctrl+Shift+Backspace可以 ...
- About Game Controllers
[About Game Controllers] Game Controller(GC),框架从iOS 7和OS X v10.9开始加入,用于便捷使用控制器(手柄). Once discovered, ...
- windows server2012部署apache项目访问后台管理系统时tomcat就停了是怎么回事
是由于环境变量没有配好的原因,找不到jre目录 tomcat的运行需要JRE,一般启动闪退都是因为找不到JRE,也就是说环境安装JDK时环境变量没有配置好. 我们首先打开”命令提示符“窗口,输入jav ...
- ASP.NET WEBAPI设计(文摘)
HTML5和移动应用推动WEB API的发展 第1部分 基础知识 第1章 因特网,万维网和HTTP协议 1.1 WEB体系结构 资源,URI(统一资源标识符)和表示 URI分为两种类型:URL(统一资 ...
- .net二纬码标签打印
在企业开发中经常用到二纬码标签,本文详细介绍.net环境下整个二纬码解决方案. 开发环境 vs2008 DevExpress8.3 ThoughtWorks.QRCode (二纬码生成组件,高版 ...
- java 对象直接序列化
序列化类,加字段后, 使用该类从现有文件反序列化时,以前字段可以正常读出 但是反序列化后,那些未对应字段会被设置成null ,即使在类的定义种已设置了初始值 --------------------- ...
- PowerDesigner工具建表步骤
以商场VIP系统中的表为例 先建立管理员用户表 1.双击打开PowerDesigner工具,点File 选择 New Model 打开如下图,选择标红部分,点击OK 2点击选择标红部位Entity ...