python xpath的基本用法
XPath是一种在XML文档中查找信息的语言,使用路径表达式在XML文档中进行导航。学习XPath需要对XML和HTML有基本的了解。
在XPath中,有七种类型的节点:文档(根)节点、元素、属性、文本、命名空间、处理指令、注释,XML 文档是被作为节点树来对待的,树的根被称为文档节点或者根节点。
<?xml version="1.0" encoding="UTF-8"?>
<bookstore> <!--bookstore为根节点-->
<book> <!--book为元素节点-->
<title lang="en">Harry Potter</title> <!--lang="en"为属性节点-->
<author>J K. Rowling</author> <!--K. Rowling为文本节点-->
<year>2005</year>
<price>29.99</price>
</book>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
</bookstore>
requests基本用法
使用requests可获取网页的源代码,需要先安装这个模块pip3 install requests
import requests
req = requests.get(url) #req为<Response [200]>,req.text为整个网页源代码
XPath的基本使用方法:
要使用XPath,需要安装一个第三方库lxml,直接在cmd命令窗口中通过pip3 install lxml即可。
from lxml import etree #导入lxml模块的etree
selector = etree.HTML(源码) #将源码转化为能被XPath匹配的格式
info1 = selector.xpath("//标签1[@属性1='值1']/标签2[@属性2='值2']/.../标签n[@属性n='值n'] ") #返回匹配到的元素节点,类型为列表
info2 = selector.xpath("//标签1[@属性1='值1']/标签2[@属性2='值2']/.../text()") #返回匹配到的元素节点的文本值,类型为列表
info3 = selector.xpath("//标签1[@属性1='值1']/标签2[@属性2='值2']/.../@属性x") #返回匹配到的元素节点的x属性值,类型为列表
基本节点选取方式

通过nodename选取返回的列表的每一个元素为元素节点,类型为class 'lxml.etree._Element'对象,最后一个元素名称不能再加/否则会报错。
text()和@attrname则可以直接获取到元素节点的文本值和属性值。
selector = etree.HTML(source) #source为上述bookstore所在的整个代码块
title_ele = selector.xpath('//book/title') #返回title元素节点对象
title_text = selector.xpath('//book/title/text()') #返回title元素节点的文本
title_attr = selector.xpath('//book/title/@lang') #返回title元素节点的lang属性值
print(title_ele[0],type(title_ele[0]))
print(title_text[0],type(title_text[0]))
print(title_attr[0],type(title_attr[0]))
# <Element title at 0x298d540ffc8> <class 'lxml.etree._Element'>
# Harry Potter <class 'lxml.etree._ElementUnicodeResult'>
# en <class 'lxml.etree._ElementUnicodeResult'>
获取元素的文本值,除了在匹配规则中直接通过/text(),也可以获取到元素对象再通过对象.text来获取,以下两种方式等价。
title1 = selector.xpath('//book/title/text()')
title2 =list( map(lambda x:x.text,selector.xpath('//book/title') ) )
除了上述基本的选取方法之外,还可以按条件进行选取,条件都放在节点名称的方括号[ ]内
限定位置选取
i1 = selector.xpath('//book[1]/title/text()') #book元素的第一个元素(注意不是从0开始)
i2 = selector.xpath('//book[last()]/title/text()') #book元素的最后一个元素
i3 = selector.xpath('//book[last()-1]/title/text()') #book元素的倒数第二个元素
i4 = selector.xpath('//book[position()<3]/title/text()') #book元素的前2个元素
限定属性选取,属性前面需加@标识
i5 = selector.xpath('//book[@class="story"]/title/text()') #class属性为story的book元素
i6 = selector.xpath('//book[@category="COOKING"]/title/text()') #category属性为COOKING的book元素
i7 = selector.xpath('//book[@category]/title/text()') #有category属性的book元素
i8 = selector.xpath('//book[starts-with(@category,"ch")]/title/text()') #category属性以ch开头的book元素,没有ends-with方法
i9 = selector.xpath('//book[contains(@category,"oo")]/title/text()') #category属性包含oo的book元素
限定文本值选取
i10 = selector.xpath('//book[price>30]/title/text()') #price的文本值大于30的book元素
i11 = selector.xpath('//book[contains(title,"day")]/title/text()') #title的文本值包含day的book元素
| 同时按多个匹配规则进行选取
i12 = selecotr.xpath('//book/title/text() | //book/@category') #同时获取book元素的title元素文本值和category属性值
通配符 *
i13 = selector.xpath('//book/*') #book元素下的所有直接子元素
i14 = selector.xpath('//book/title[@+]') #book元素下有属性的title元素
python xpath的基本用法的更多相关文章
- Python Xpath语法
Python Xpath语法 一.选取节点 常用的路劲表达式: 表达式 描述 实例 nodename 选取nodename节点的所有子节点 xpath('//div') 选取了div节点 ...
- 使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接
使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接: 使用requests获取html后,分析html中的标签发现所需要的链接在& ...
- python 中del 的用法
python中的del用法比较特殊,新手学习往往产生误解,弄清del的用法,可以帮助深入理解python的内存方面的问题. python的del不同于C的free和C++的delete. 由于pyth ...
- Python多进程并发(multiprocessing)用法实例详解
http://www.jb51.net/article/67116.htm 本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Pyt ...
- xpath的一般用法与特殊用法
# xpath的使用 安装lxml from lxml import etree Selector = etree.HTML(网页代码) Selector.xpath(一段神奇的代码) xpath的一 ...
- Python dictionary 字典 常用法
Python dictionary 字典 常用法 d = {} d.has_key(key_in) # if has the key of key_in d.keys() ...
- 【python】 del 的用法
转自 https://blog.csdn.net/love1code/article/details/47276683 python中的del用法比较特殊,新手学习往往产生误解,弄清del的用法,可以 ...
- Python Numpy shape 基础用法(转自他人的博客,如涉及到侵权,请联系我)
Python Numpy shape 基础用法 shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度.它的输入 ...
- python中argparse模块用法实例详解
python中argparse模块用法实例详解 这篇文章主要介绍了python中argparse模块用法,以实例形式较为详细的分析了argparse模块解析命令行参数的使用技巧,需要的朋友可以参考下 ...
随机推荐
- MySQL新密码机制介绍caching_sha2_password
MySQL添加了对身份验证插件的支持,该插件现在称为mysql_native_password.该mysql_native_password插件使用SHA1哈希 将密码(SHA1(SHA1(passw ...
- MySQL 字符串索引优化方案
字符串建立索引的优化 1. 建立前缀索引 假设建立一个支持邮箱登录的用户表,对于邮件字段来说,可以有以下几种建立索引的方式: 直接对整个字符串建立索引 alter table SUser add in ...
- Demo_2:Qt实现猜字小游戏
1 环境 系统:windows 10 代码编写运行环境:Qt Creator 4.4.1 (community) Github: 2 简介 参考视频:https://www.bilibili.co ...
- LeetCode 第 196 场周赛 (题目:5452-5455,这是参加过最坑的周赛,暴力n^2居然可以过)
5452. 判断能否形成等差数列 给你一个数字数组 arr . 如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 . 如果可以重新排列数组形成等差数列,请返回 tru ...
- Linux进程监控命令
最近使用centos在建站,没有用市面上的什么服务商的服务器,自己用树莓派3B+建了这个博客.但是发现经常宕机,所以想看看服务器在干什么,百度了很久,发现vmstat命令不错,拿出来推荐推荐. 这是我 ...
- day40 线程
目录 一.开启线程的两种方式 二.用进程和线程分别实现tcp 三.线程对象实现join方法 四.同一个进程下的多个线程数据是共享的 五.线程对象属性及其他方法 六.守护线程 七.线程互斥锁 八.GIL ...
- JavaScript图形实例:Canvas API
1.Canvas概述 Canvas API(画布)用于在网页实时生成图像,并且可以操作图像内容,基本上它是一个可以用JavaScript操作的位图(bitmap). 要使用HTML5在浏览器窗口中绘制 ...
- DOM 和 BOM 区别
DOM, DOCUMENT, BOM, WINDOW 区别DOM 是为了操作文档出现的 API,document 是其的一个对象:BOM 是为了操作浏览器出现的 API,window 是其的一个对象. ...
- 机器学习实战基础(二十七):sklearn中的降维算法PCA和SVD(八)PCA对手写数字数据集的降维
PCA对手写数字数据集的降维 1. 导入需要的模块和库 from sklearn.decomposition import PCA from sklearn.ensemble import Rando ...
- 数据可视化之PowerQuery篇(二)这个方法帮你快速计算列
https://zhuanlan.zhihu.com/p/81846862 PowerQuery中,对两列或者多列的计算一般通过添加自定义列来实现,以下表为例, 如果需要1月和2月数据的合计,可以添加 ...