scrapy Selector用法及xpath语法
准备工作
html示例:
<?xml version="1.0" encoding="UTF-8"?>
<html
<head>
    <title>text</title>
</head>
<body>
<div class="cdiv">
    <p class="cp1 section">test p1 <span>next p1</span></p>
    <ul>
        <li id="0">1</li>
        <li id="1">2</li>
        <li id="2">3</li>
    </ul>
</div>
<div class="cdiv1">
     <p class="cp2">test p2 <span>next p2</span></p>
     <ul>
        <li id="3">4</li>
        <li id="4">5</li>
        <li id="5">6</li>
    </ul>
</div>
<p class="item">test in p </p>
<li id="6" class="item cli-1">7</li>
<li id="7" class="item cli-2">8</li>
</body>
</html>
把该示例保存到test.html中.
创建python文件,输入代码
from scrapy.selector import Selector
doc = ''
with open('./test.html', 'r') as f:
    doc = f.read()
sel = Selector(text=doc)
后面所有的示例代码都会添加到这个文件中
Selector的主要方法
得到选中节点的字符串
get():  得到选中节点列表中的第一个中节点, 并转换成字符串返回。
getall(): 得到选中节点列表中的所有节点,并转换成字符串返回。
示例:
#得到选中节点字符串
res = sel.css('.cdiv').xpath(".//li").get()
print(res)
res = sel.css('.cdiv').xpath(".//li").getall()
print(res)
结果:
<li id="0">1</li>
['<li id="0">1</li>', '<li id="1">2</li>', '<li id="2">3</li>']
用正则表达式匹配
re(regex): 用正则表达式匹配节点,并返回匹配的字符串。
示例:
res = sel.css('body .item').re(r'cli\-\d+')
print(res)
结果:
['cli-1', 'cli-2']
使用xpath表达式选择节点
xpath(query): 使用xpath表达式选择节点, 并返包含选中节点的Selector对象.
使用css选择器选中节点
css(query): 使用css选择器表达式选择节点, 并返包含选中节点的Selector对象
xpath 语法
选择所有的子节点
//{node}:  选择根节点下所有标签为{node}的子节点.
//{node}//{node1}:  选择根节点下所有标签为{node1}且父节点包含标签{node}的节点
示例1:
res = sel.xpath("//li")
print(res)
结果:
[<Selector xpath='//li' data='<li id="0">1</li>'>, <Selector xpath='//li' data='<li id="1">2</li>'>, <Selector xpath='//li' data='<li id="2">3</li>'>, <Selector xpath='//li' data='<li id="3">4</li>'>, <Selector xpath='//li' data='<li id="4">5</li>'>, <Selector xpath='//li' data='<li id="5">6</li>'>, <Selector xpath='//li' data='<li id="6" class="item cli-1">7</li>'>, <Selector xpath='//li' data='<li id="7" class="item cli-2">8</li>'>]
示例2
res = sel.xpath("//ul//li")
print(res)
结果
[
<Selector xpath='//ul//li' data='<li>1</li>'>,
<Selector xpath='//ul//li' data='<li>2</li>'>,
<Selector xpath='//ul//li' data='<li>3</li>'>,
<Selector xpath='//ul//li' data='<li>4</li>'>,
<Selector xpath='//ul//li' data='<li>5</li>'>,
<Selector xpath='//ul//li' data='<li>6</li>'>
]
选择直接子节点
{node}/{node1}: 选择从{node}的直接子节点中选择标签为{node1}节点.
示例1:
res = sel.xpath("//body/li")
print(res)
结果:
[<Selector xpath='//body/li' data='<li id="6" class="item cli-1">7</li>'>, <Selector xpath='//body/li' data='<li id="7" class="item cli-2">8</li>'>]
从选择的子节点列表中选择第n个子节点
//{node}[n]: 先把兄弟节点聚合在一个list变成[list_1, list_2, ...], 然后从每个list中选择第n个, 如果list的长度不足n个则跳过. 
(//{node})[n]: 把所有选择的节点放在一条list, 然后从这个list中选择第n个
示例1:
res = sel.xpath("//li[1]")
print(res)
res = sel.xpath("//li[3]")
print(res)
结果:
[<Selector xpath='//li[1]' data='<li id="0">1</li>'>, <Selector xpath='//li[1]' data='<li id="3">4</li>'>, <Selector xpath='//li[1]' data='<li id="6" class="item cli-1">7</li>'>]
[<Selector xpath='//li[3]' data='<li id="2">3</li>'>, <Selector xpath='//li[3]' data='<li id="5">6</li>'>]
示例2
res = sel.xpath("(//li)[1]")
print(res)
res = sel.xpath("(//li)[3]")
print(res)
结果:
[<Selector xpath='(//li)[1]' data='<li>1</li>'>]
[<Selector xpath='(//li)[3]' data='<li>3</li>'>]
使用节点属性作为选择条件
{node}[@{attr}='{val}']: 选中节点必须有名字为{attr}的属性, 且这个属性的值等于{val}.
{node}[contains(@{attr}, '{val}']: 选中节点必须有名字为'{attr}'的属性, 且这个属性的值包含{val}.
示例1
res = sel.xpath("//p[@class='cp1']")
print(res)
res = sel.xpath("//p[@class='cp2']")
print(res)
res = sel.xpath("//p[contains(@class, 'cp1')]")
print(res)
结果
[]
[<Selector xpath="//p[@class='cp2']" data='<p class="cp2">test p2 <span>next p2<...'>]
[<Selector xpath="//p[contains(@class, 'cp1')]" data='<p class="cp1 section">test p1 <span>...'>]
[<Selector xpath="descendant-or-self::p[@class and contains(concat(' ', normalize-space(@class), ' '), ' cp1 ')]" data='<p class="cp1 section">test p1 <span>...'>]
在包含条件中, 如果使用'class'属性, 可以用css选择器简化:
示例2:
res = sel.css("p.cp1")
print(res)
结果:
[<Selector xpath="descendant-or-self::p[@class and contains(concat(' ', normalize-space(@class), ' '), ' cp1 ')]" data='<p class="cp1 section">test p1 <span>...'>]
提取节点属性的值
{node}/@{attr}: 提取选择节的点中属性名为{attr}的值.
示例1:
res = sel.xpath("//p/@class")
print(res)
print("\n")
结果
[<Selector xpath='//p/@class' data='cp1 section'>, <Selector xpath='//p/@class' data='cp2'>]
提取节点中的文本内容
{node}/text(): 提取当前选择节点的文本内容, 不包括子节点的文本.
{node}//text(): 提取选择节点的文本内容, 包括子节点的文本.
示例1:
res = sel.xpath("//p//text()")
print(res)
res = sel.xpath("//p/text()")
print(res)
结果:
[<Selector xpath='//p//text()' data='test p1 '>, <Selector xpath='//p//text()' data='next p1'>, <Selector xpath='//p//text()' data='test p2 '>, <Selector xpath='//p//text()' data='next p2'>]
[<Selector xpath='//p/text()' data='test p1 '>, <Selector xpath='//p/text()' data='test p2 '>]
在xpath表达式中使用变量
在xpath表达式中是${varname}定义变量, 类似于bash
示例1:
#使用变量$val
res = sel.xpath("//li[@id=$val]", val='1')
print(res)
res = sel.xpath("//li[@id=$val]", val='3')
print(res)
res = sel.xpath("//li[@id=$val]", val='6')
print(res)
结果:
[<Selector xpath='//li[@id=$val]' data='<li id="1">2</li>'>]
[<Selector xpath='//li[@id=$val]' data='<li id="3">4</li>'>]
[<Selector xpath='//li[@id=$val]' data='<li id="6" class="item cli-1">7</li>'>]
												
											scrapy Selector用法及xpath语法的更多相关文章
- Python爬虫利器三之Xpath语法与lxml库的用法
		
前面我们介绍了 BeautifulSoup 的用法,这个已经是非常强大的库了,不过还有一些比较流行的解析库,例如 lxml,使用的是 Xpath 语法,同样是效率比较高的解析方法.如果大家对 Beau ...
 - 12.Python爬虫利器三之Xpath语法与lxml库的用法
		
LXML解析库使用的是Xpath语法: XPath 是一门语言 XPath可以在XML文档中查找信息 XPath支持HTML XPath通过元素和属性进行导航 XPath可以用来提取信息 XPath比 ...
 - Xpath语法与lxml库的用法
		
BeautifulSoup 已经是非常强大的库了,不过还有一些比较流行的解析库,例如 lxml,使用的是 Xpath 语法,同样是效率比较高的解析方法. 1.安装 pip install lxml 2 ...
 - 芝麻HTTP:Python爬虫利器之Xpath语法与lxml库的用法
		
安装 pip install lxml 利用 pip 安装即可 XPath语法 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历.XPat ...
 - XPath语法 在C#中使用XPath例子与用法
		
XPath可以快速定位到Xml中的节点或者属性.XPath语法很简单,但是强大够用,它也是使用xslt的基础知识.示例Xml: <?xml version="1.0" enc ...
 - 爬虫解析之css,xpath语法
		
一.xpath语法 xpath实例文档 <?xml version="1.0" encoding="ISO-8859-1"?> <bookst ...
 - XPATH语法(二)
		
节点(node) 在 XPath 中,有七种类型的节点:元素.属性.文本.命名空间.处理指令.注释以及文档(根)节点.XML 文档是被作为节点树来对待的.树的根被称为文档节点或者根节点. 以下面这xm ...
 - Python    Xpath语法
		
Python Xpath语法 一.选取节点 常用的路劲表达式: 表达式 描述 实例 nodename 选取nodename节点的所有子节点 xpath('//div') 选取了div节点 ...
 - Xpath语法-爬虫(一)
		
前言 这一章节主要讲解Xpath的基础语法,学习如何通过Xpath获取网页中我们想要的内容;为我们的后面学习Java网络爬虫基础准备工作. 备注:此章节为基础核心章节,未来会在网络爬虫的数据解析环节经 ...
 
随机推荐
- JavaScript的函数(一)
			
,1,在javascript中,函数即对象.函数里面的参数可以是个函数,例如: data.sort(function(a,b){return a-b;}) 函数的返回值,return语句导致函数停止执 ...
 - seo搜索优化教程13-SEO搜索引擎站点收录
			
为了使大家更方便的了解及学习网络营销推广.seo搜索优化,星辉科技强势推出seo搜索优化教程.此为seo教程第13课 想要用户能够在搜索引擎中通过关键词搜索到您的页面信息,首先要做的是让搜索引擎收录您 ...
 - des 加密解密工具类
			
最近在做des的双对称加密解密,特此记录一下. des对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码 ...
 - Redis集群搭建及选举原理
			
redis集群简述 哨兵模式中如果主从中master宕机了,是通过哨兵来选举出新的master,在这个选举切换主从的过程,整个redis服务是不可用的.而且哨兵模式中只有一个主节点对外提供服务,因此没 ...
 - dpdk中QSBR具体实现
			
目录 dpdk-QSBR实现 初始化 注册与注销 上线与下线 等待静默 附录 参考 dpdk-QSBR实现 dpdk19.01提供了qsbr模式的rcu库,其具体实现在lib/librte_rcu目录 ...
 - 何为内存模型(JMM)?
			
前言 任何一门语言都有其语言规范,从逻辑上我们可划分为语法规范和语义规范,语法规范则是描述了如何通过相关语法编写可执行的程序,而语义规范则是指通过语法编写的程序所构造出的具体含义.语言只要具备存储(比 ...
 - vscode 新版设置备份20200221 settings.json
			
vscode 新版设置备份20200221 { "sync.gist": "9e6a5f7e8c52047b03c8732ff88aab0e", "s ...
 - Git 基础入门
			
目录 git安装 基本设置 创建版本库 相关概念 将代码提交到分支仓库 版本回退 代码修改 撤销修改 文件删除 github 远程仓库 添加远程仓库 克隆远程仓库 分支操作 忽略特殊文件 git安装 ...
 - H5新特性之语义化标签
			
一.为什么要增加新的语义化标签 在HTML 5出来之前,我们用div来表示章节,但是这些div都没有实际意义,这样的布局方式使我们的结构不够清晰,于是语义化标签应运而生. 二.何为语义化标签 顾名思义 ...
 - 「每天五分钟,玩转 JVM」:对象访问定位
			
前言 在「对象内存布局」一节中,我们了解到对象头中包含了一个叫做类型指针的东西,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例.但是,并不是所有的虚拟机都是这么去做的.不 ...