准备工作

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语法的更多相关文章

  1. Python爬虫利器三之Xpath语法与lxml库的用法

    前面我们介绍了 BeautifulSoup 的用法,这个已经是非常强大的库了,不过还有一些比较流行的解析库,例如 lxml,使用的是 Xpath 语法,同样是效率比较高的解析方法.如果大家对 Beau ...

  2. 12.Python爬虫利器三之Xpath语法与lxml库的用法

    LXML解析库使用的是Xpath语法: XPath 是一门语言 XPath可以在XML文档中查找信息 XPath支持HTML XPath通过元素和属性进行导航 XPath可以用来提取信息 XPath比 ...

  3. Xpath语法与lxml库的用法

    BeautifulSoup 已经是非常强大的库了,不过还有一些比较流行的解析库,例如 lxml,使用的是 Xpath 语法,同样是效率比较高的解析方法. 1.安装 pip install lxml 2 ...

  4. 芝麻HTTP:Python爬虫利器之Xpath语法与lxml库的用法

    安装 ​pip install lxml 利用 pip 安装即可 XPath语法 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历.XPat ...

  5. XPath语法 在C#中使用XPath例子与用法

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

  6. 爬虫解析之css,xpath语法

    一.xpath语法 xpath实例文档 <?xml version="1.0" encoding="ISO-8859-1"?> <bookst ...

  7. XPATH语法(二)

    节点(node) 在 XPath 中,有七种类型的节点:元素.属性.文本.命名空间.处理指令.注释以及文档(根)节点.XML 文档是被作为节点树来对待的.树的根被称为文档节点或者根节点. 以下面这xm ...

  8. Python Xpath语法

    Python    Xpath语法   一.选取节点 常用的路劲表达式: 表达式 描述 实例   nodename 选取nodename节点的所有子节点 xpath('//div') 选取了div节点 ...

  9. Xpath语法-爬虫(一)

    前言 这一章节主要讲解Xpath的基础语法,学习如何通过Xpath获取网页中我们想要的内容;为我们的后面学习Java网络爬虫基础准备工作. 备注:此章节为基础核心章节,未来会在网络爬虫的数据解析环节经 ...

随机推荐

  1. 2020最新ArchLinux安装(KDE桌面)

    许多网友反映之前的教程安装好后连不上互联网,最近我刚好又安装了一遍,总结出以下没毛病的过程 按照此教程需要你会基本的vim操作(或其他文本编辑工具比如nano),基本的fdisk分盘操作(或其他分盘工 ...

  2. java线程并发工具类

    本次内容主要讲Fork-Join.CountDownLatch.CyclicBarrier以及Callable.Future和FutureTask,最后再手写一个自己的FutureTask,绝对干货满 ...

  3. python使用for循环打印9*9乘法表。

    代码如下: for a in range(1, 10): for b in range(1, 10): if b <= a: print("%d*%d=%d\t" % (b, ...

  4. 超级干货:动态防御WAF技术原理及编程实战!

    本文带给大家的内容是动态防御WAF的技术原理及编程实战. 将通过介绍ShareWAF的核心技术点,向大家展示动态防御的优势.实现思路,并以编程实战的方式向大家展示如何在WAF产品开发过程中应用动态防御 ...

  5. vnstat 流量统计 并附带一个小 php 查看流量的页面

    安装apt-get install vnstat 配置到自动启动update-rc.d vnstat enable 启动/etc/init.d/vnstat start vnstat基本使用命令 vn ...

  6. 利用Python爬取OPGG上英雄联盟英雄胜率及选取率信息

    一.分析网站内容 本次爬取网站为opgg,网址为:” http://www.op.gg/champion/statistics” 由网站界面可以看出,右侧有英雄的详细信息,以Garen为例,胜率为53 ...

  7. Python中使用os模块执行远程命令

    1. 使用os模块远程执行命令 服务端代码 1 import socket 2 import os 3 4 sh_server = socket.socket() #创建一个socket对象 5 sh ...

  8. JavaScript的自调用函数

    函数表达式可以 "自调用". 自调用表达式会自动调用. 如果表达式后面紧跟 () ,则会自动调用. 不能自调用声明的函数. 通过添加括号,来说明它是一个函数表达式: <scr ...

  9. Simulink仿真入门到精通(四) Simulink子系统

    4.1 Simulink子系统详解 4.1.1 子系统概述 Simulink根据仿真特性将模块的属性分为两种:虚拟模块和非虚拟模块. 非虚拟模块在仿真过程中起到实际的作用,对其进行编辑或者增加删除操作 ...

  10. Leetcode 1160: 拼写单词

    给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars. 假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌 ...