XPATH语法(二)
节点(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语法(二)的更多相关文章
- 爬虫解析之css,xpath语法
一.xpath语法 xpath实例文档 <?xml version="1.0" encoding="ISO-8859-1"?> <bookst ...
- Xpath语法-爬虫(一)
前言 这一章节主要讲解Xpath的基础语法,学习如何通过Xpath获取网页中我们想要的内容;为我们的后面学习Java网络爬虫基础准备工作. 备注:此章节为基础核心章节,未来会在网络爬虫的数据解析环节经 ...
- 正则表达式(特殊字符)/Xpath语法/CSS选择器
正则表达式(特殊字符) ^ 开头 '^b.*'----以b开头的任意字符 $ 结尾 '^b.*3$'----以b开头,3结尾的任意字符 * 任意长度(次数),≥0 ? 非贪婪模式,非贪婪模式尽可能少的 ...
- 请求数据分析 xpath语法 与lxml库
前情提要: 上节学过从网上获取请求,获取返回内容,带理 获取内容之后,第二部就是获取请求的数据分析 一:xpath 语法 浏览器一般会自带xpatn 解析 这里大概讲述一下xpath 的基本操作 二: ...
- XPath语法规则及实例
XPath语法规则及实例 XPath语法规则 一.XPath术语: 1.节点:在XPath中,有七种类型的节点:元素.属性.文本.命名空间.处理指令.注释以及文档(根)节点. XML文档是被作为节点树 ...
- Python Xpath语法
Python Xpath语法 一.选取节点 常用的路劲表达式: 表达式 描述 实例 nodename 选取nodename节点的所有子节点 xpath('//div') 选取了div节点 ...
- Python爬虫之xpath语法及案例使用
Python爬虫之xpath语法及案例使用 ---- 钢铁侠的知识库 2022.08.15 我们在写Python爬虫时,经常需要对网页提取信息,如果用传统正则表达去写会增加很多工作量,此时需要一种对数 ...
- PHP语法(二):数据类型、运算符和函数
相关链接: PHP语法(一):基础和变量 PHP语法(二):数据类型.运算符和函数 PHP语法(三):控制结构(For循环/If/Switch/While) 这次整理了PHP的数据类型.运算符和函数. ...
- Python爬虫利器三之Xpath语法与lxml库的用法
前面我们介绍了 BeautifulSoup 的用法,这个已经是非常强大的库了,不过还有一些比较流行的解析库,例如 lxml,使用的是 Xpath 语法,同样是效率比较高的解析方法.如果大家对 Beau ...
随机推荐
- dos初始操作和全屏方法
1.初始操作 mount d d:\ ;选择挂载的硬盘 d:\ cd Dos cd MASM ;到达debug/edit/link/masm.exe文件的位置 ;然后可以进行debug/edit xx ...
- printf 中的 %.*s
printf("message arrived %.*s\n", length, str); .*代表length 当 str 长度大于等于 length,打印出 str 前 le ...
- maveb安装与配置(win10)
转载:https://www.cnblogs.com/eagle6688/p/7838224.html 看了几篇博客,感觉这篇博客写的含金量最高了,因为我电脑的系统是win10的,所以配置有细微的差别 ...
- 【已解决】ERR_BLOCKED_BY_XSS_AUDITOR:Chrome 在此网页上检测到了异常代码:解决办法
工作中,用Selenium自动化填表并获取结果时,程序一直安静的读取数据库,网页填表,获取结果,存库,但跑着跑着突然报错了. 排查后,原来不是Selenium的问题,是数据比较特殊,带了个双引号,如下 ...
- tomcat在Debug模式下无法启动解决办法
环境:eclipse,JDK1.6,tomcat6.0 问题:在server中正常启动tomcat是没问题的,javaweb项目也可正常访问,使用debug模式启动的话速度特别慢(好像一直处于那种启动 ...
- C++面试集锦( 面试被问到的问题 )
1. C 和 C++ 区别 2. const 有什么用途 主要有三点: 1:定义只读变量,即常量 2:修饰函数的参数和函数的返回值 3: 修饰函数的定义体,这里的函数为类的成员函数,被cons ...
- java RSA 加签验签【转】
引用自: http://blog.csdn.net/wangqiuyun/article/details/42143957/ java RSA 加签验签 package com.testdemo.co ...
- UVALive 4725 Airport(二分)
题目链接 题意 机场有两种飞机,每小时一些飞机到达,每小时安排一架飞机起航.求任意时刻中两种飞机数目的最大值的最小值. 分析 首先肯定是二分来做.这里的难点在于如何判断飞机数目是否合法.一开始忽略了某 ...
- 散列之HashTable学习
1,什么是散列? 举个例子,在日常生活中,你将日常用品都放在固定的位置,当你下次需要该东西时,直接去该地方取它.这个过程就相当于散列查找. 若将它们随意杂乱无章地存放,当需要某件东西时,只能一个地方一 ...
- [C++]线性链表之顺序表<二>
/* @content 线性链表之顺序表 @date 2017-3-21 1:06 @author Johnny Zen */ /* 线性表 顺序表 链式表[带头指针/不 ...