节点(node)

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

以下面这xml文档为例:

    <?xml version="1.0" encoding="ISO-8859-1"?>

    <class>

    <student>
<name gender="boy">Harry Potter</name>
<ID>24</ID>
</student> <student>
<name gender="girl">Li Rose<font color=red>(monitor)</font></title>
<ID>1</ID>
</student> </class>

上面例子的节点为:

    <classs> (文档节点/根节点)
<ID>24</ID> (元素节点)
gender="boy" (属性节点)

节点关系

父:每个元素以及属性都有一个父。例子中<student>的父是<class>;
子:元素节点可有零个、一个或多个子。例子中<class>的子是<student>;
兄弟:拥有相同的父的节点。例子中<name>和<ID>是兄弟;
祖先:某节点的父、父的父,等等。
后代:某节点的子、子的子,等等。

基本值(或称原子值,Atomic value)

基本值是无父或无子的节点。
上面例子的基本值为:

    Harry Potter
"boy"

项目(Item)

项目是基本值或者节点。


ok,接下来开始正式讲解 XPath 语法(注意,以下表达式当然可以混合使用):

1 nodename

选取此节点的所有子节点。

from scrapy import Selector

def parse(self, response):
selector=Selector(response)
content=selector.xpath(class)# 选取 class 元素的所有子节点。

2 /

从根节点选取。

from scrapy import Selector

def parse(self, response):
selector=Selector(response)
'''
选取根元素 class。
注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
'''
content1=selector.xpath(/class)
content2=selector.xpath(/class/student)

3 //

从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。

from scrapy import Selector

def parse(self, response):
selector=Selector(response)
content=selector.xpath(//ID)# 选取所有ID子元素,而不管它们在文档中的位置。

4 .

选取当前节点。

5 ..

选取当前节点的父节点。

6 @

选取属性。

from scrapy import Selector

def parse(self, response):
selector=Selector(response)
# 选取所有gender="boy"属性的节点,而不管它们在文档中的位置。
content=selector.xpath(//[@gender="boy"])

7 谓语(Predicates)

/class/student[1]
选取属于 class 子元素的第一个 student 元素。 /class/student[last()]
选取属于 class 子元素的最后一个 student 元素。 /class/student[last()-1]
选取属于 class 子元素的倒数第二个 student 元素。 /class/student[position()<3]
选取属于 class 子元素的前两个 student 元素。 /class/student[@gender]
选取所有拥有名为 gender 的属性的 student 元素。 /class/student[@gender="boy"]
选取所有拥有 gender="boy" 属性的 student 元素。 /class/student[ID<50]
选取 class 元素的所有 student 元素,且其中的 ID 元素的值须小于 50。 /class/student[ID<50]/name
选取 class 元素中的 student 元素的所有 name 元素,且其中的 ID 元素的值须小于 35。

8 通配符

    1. *              匹配任何元素节点
2. @* 匹配任何属性节点
3. node() 匹配任何类型的节点

9 拓展

对于如下的xml文档(参照http://www.tuicool.com/articles/iqQFBn

<div id="test2">美女,<font color=red>你的微信是多少?</font><div>

如果使用:
data = selector.xpath('//div[@id="test2"]/text()').extract()[0]
只能提取到“美女,”;

如果使用:
data = selector.xpath('//div[@id="test2"]/font/text()').extract()[0]
又只能提取到“你的微信是多少?”

到底我们要怎样才能把“美女,你的微信是多少”提取出来?

可以使用xpath的string(.)来达到目的

    data = selector.xpath('//div[@id="test2"])
info = data.xpath('string(.)').extract()[0]

XPATH语法(二)的更多相关文章

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

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

  2. Xpath语法-爬虫(一)

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

  3. 正则表达式(特殊字符)/Xpath语法/CSS选择器

    正则表达式(特殊字符) ^ 开头 '^b.*'----以b开头的任意字符 $ 结尾 '^b.*3$'----以b开头,3结尾的任意字符 * 任意长度(次数),≥0 ? 非贪婪模式,非贪婪模式尽可能少的 ...

  4. 请求数据分析 xpath语法 与lxml库

    前情提要: 上节学过从网上获取请求,获取返回内容,带理 获取内容之后,第二部就是获取请求的数据分析 一:xpath 语法 浏览器一般会自带xpatn 解析 这里大概讲述一下xpath 的基本操作 二: ...

  5. XPath语法规则及实例

    XPath语法规则及实例 XPath语法规则 一.XPath术语: 1.节点:在XPath中,有七种类型的节点:元素.属性.文本.命名空间.处理指令.注释以及文档(根)节点. XML文档是被作为节点树 ...

  6. Python Xpath语法

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

  7. Python爬虫之xpath语法及案例使用

    Python爬虫之xpath语法及案例使用 ---- 钢铁侠的知识库 2022.08.15 我们在写Python爬虫时,经常需要对网页提取信息,如果用传统正则表达去写会增加很多工作量,此时需要一种对数 ...

  8. PHP语法(二):数据类型、运算符和函数

    相关链接: PHP语法(一):基础和变量 PHP语法(二):数据类型.运算符和函数 PHP语法(三):控制结构(For循环/If/Switch/While) 这次整理了PHP的数据类型.运算符和函数. ...

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

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

随机推荐

  1. 2018 ACM 网络选拔赛 徐州赛区

    A. Hard to prepare #include <cstdio> #include <cstdlib> #include <cmath> #include ...

  2. MySQL中双NDBD节点Cluster快速配置

    是MySQL适合于分布式计算环境的高实用.高冗余版本.它采用了NDB Cluster 存储引擎,允许在1个 Cluster 中运行多个MySQL服务器.在MyQL 5.0及以上的二进制版本中.以及与最 ...

  3. 多目标遗传算法 ------ NSGA-II (部分源码解析)两个个体支配判断 dominance.c

    /* Domination checking routines */ # include <stdio.h> # include <stdlib.h> # include &l ...

  4. 5、JDBC-元信息

    DatabaseMetaData:描述数据库的元数据对象 获取所有数据库 import org.junit.jupiter.api.AfterEach; import org.junit.jupite ...

  5. 为什么要用dubbo,dubbo和zookeeper关系

    为什么要用dubbo? 当网站规模达到了一定的量级的时候,普通的MVC框架已经不能满足我们的需求,于是分布式的服务框架和流动式的架构就凸显出来了.     单一应用架构 当网站流量很小时,只需一个应用 ...

  6. (零)SQL server安装配置

    ( 这里附加一个破解码: YFC4R-BRRWB-TVP9Y-6WJQ9-MCJQ7 ) (不选择) (默认实例,还有不建议安装在根目录下,可以安装到D盘之类的) (添加当前用户) (都选择仅安装) ...

  7. android studio 统一管理版本号配置

    1.在android 的根目录新建一个versions.gradle 2.在这里面声明 各个第三方库的版本,写法有两种,第一种,写ext 扩展, 引用的时候, 第二种: 然后在project级的bui ...

  8. Python排序算法之选择排序

    选择排序 选择排序比较好理解,好像是在一堆大小不一的球中进行选择(以从小到大,先选最小球为例): 1. 选择一个基准球 2. 将基准球和余下的球进行一一比较,如果比基准球小,则进行交换 3. 第一轮过 ...

  9. Python排序算法之冒泡排序

    冒泡排序 顾名思义,冒泡排序直观的意思是气泡越大冒的越快:),对应到我们的列表中就是数字最大的先选出来,然后依次进行.例如 myList = [1,4,5,0,6],比较方式为: 相邻的两个数字先进行 ...

  10. golang error信息转字符串 x := fmt.Sprintf("%s", err)

    _, _, ch, err := m.ZkConn.ChildrenW(node) if err != nil { x := fmt.Sprintf("%s", err) if s ...