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

  1. Python Xpath语法

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

  2. 使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接

    使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接: 使用requests获取html后,分析html中的标签发现所需要的链接在& ...

  3. python 中del 的用法

    python中的del用法比较特殊,新手学习往往产生误解,弄清del的用法,可以帮助深入理解python的内存方面的问题. python的del不同于C的free和C++的delete. 由于pyth ...

  4. Python多进程并发(multiprocessing)用法实例详解

    http://www.jb51.net/article/67116.htm 本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Pyt ...

  5. xpath的一般用法与特殊用法

    # xpath的使用 安装lxml from lxml import etree Selector = etree.HTML(网页代码) Selector.xpath(一段神奇的代码) xpath的一 ...

  6. Python dictionary 字典 常用法

    Python dictionary 字典 常用法 d = {} d.has_key(key_in)       # if has the key of key_in d.keys()          ...

  7. 【python】 del 的用法

    转自 https://blog.csdn.net/love1code/article/details/47276683 python中的del用法比较特殊,新手学习往往产生误解,弄清del的用法,可以 ...

  8. Python Numpy shape 基础用法(转自他人的博客,如涉及到侵权,请联系我)

    Python Numpy shape 基础用法 shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度.它的输入 ...

  9. python中argparse模块用法实例详解

    python中argparse模块用法实例详解 这篇文章主要介绍了python中argparse模块用法,以实例形式较为详细的分析了argparse模块解析命令行参数的使用技巧,需要的朋友可以参考下 ...

随机推荐

  1. html+css快速入门教程(3)

    练习: 1.画盒子 2.相框 5 基础选择器 5.1 id选择器 ID选择器与类选择器的定义与引用方式类似,只是定义的符号不一样.ID通常表示唯一值,因此,ID选择器在CSS 中通常只出现一次.如果出 ...

  2. 基于 fetch 的请求封装

    原生 fetch 请求失败后(如无网络)状态会变成 reject 走 .catch .绝大多数情况下业务场景只需要给个 toast 等简单处理.每个请求都 .catch 会显得格外繁琐,并且如果不 . ...

  3. Python之浅谈函数

    目录 文件的高级应用 文件修改的两种方式 第一种 第二种 函数的定义 函数的参数 函数的返回值 文件的高级应用 r+即可读又可写,并且是在后面追加 w+清空文件的功能是w提供的 a+a有追加的功能,a ...

  4. 学习 Spring Boot 知识看这一篇就够了

    从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区.我的博客和我的公号内.粗略的统计了一下总共的文章加起来大概有六十多篇了,其 ...

  5. 性能测试之Jmeter中场景设置与启动方式

    Jmeter场景设置与启动方式 性能测试场景是用来模拟模拟真实用户操作的工作单元,所以场景设计一定要切合用户的操作逻辑,jmeter主要是通过线程组配合其他组件来一起完成场景的设置. 线程组设置 Jm ...

  6. 深度学习论文翻译解析(九):Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

    论文标题:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 标题翻译:用于视觉识别的深度卷积神 ...

  7. python学习笔记之装饰器、生成器、内置函数、json(五)

    一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面 ...

  8. 浅谈.Net Core DependencyInjection源码探究

    前言     相信使用过Asp.Net Core开发框架的人对自带的DI框架已经相当熟悉了,很多刚开始接触.Net Core的时候觉得不适应,主要就是因为Core默认集成它的原因.它是Asp.Net ...

  9. day10 基本数据类型(下)

    目录 一.集合 1.作用 2.定义 3.类型转换 4.内置方法 4.1交集:两者共有的 4.2合集:两者融合去重 4.3差集:某个集合单独有的 4.4对称差集:两个集合各自单独有的组成的集合 4.5父 ...

  10. 深入Vue-router最佳实践

    前言 最近再刷Vue周边生态的官方文档,因为之前的学习都是看视频配合着文档,但主要还是通过视频学习,所以很多知识点都没有了解,至从上次刷了Vuex的官方文档就体会到了通读文档的好处,学习一门技术最好的 ...