一、xpath 简介

究竟什么是 xpath 呢?简单来说,xpath 就是一种在 XML 文档中查找信息的语言

而 XML 文档就是由一系列节点构成的树,例如,下面是一份简单的 XML 文档:

<html>
<body>
<div>
<p>Hello world<p>
<a href="/home">Click here</a>
</div>
</body>
</html>

XML 文档中常见的节点包括:

  • 根节点:html
  • 元素节点:html、body、div、p、a
  • 属性节点:href
  • 文本节点:Hello world、Click here

XML 文档中常见的节点间关系包括:

  • 父子:例如,<p> 和 <a> 是 <div> 的子节点,反之,也称 <div> 是 <p> 和 <a> 的父节点
  • 兄弟:例如,<p> 和 <a> 称为兄弟节点
  • 祖先/后代:例如,<body>、<div>、<p>、<a> 都是 <html> 的后代节点,反之,也称 <html> 是 <body>、<div>、<p>、<a> 的祖先节点

对于网页解析来说,xpath 比 re 更加方便简洁,故 Python 中也提供相应的模块 —— lxml.etree

我们可以使用 pip install lxml 命令进行安装

二、xpath 使用

在正式开始讲解 xpath 的使用方法之前,我们先来构造一个简单的 XML 文档用于测试

在一般的爬虫程序中,XML 文档就是爬取回来的网页源代码

>>> sc = '''
<html>
<head>
<meta charset="UTF-8"/>
<link rel="stylesheet" href="style/base.css"/>
<title>Example website</title>
</head>
<body>
<div id="images" class="content">
<a href="image1.html">Image1<img src="image1.jpg"/></a>
<a href="image2.html">Image2<img src="image2.jpg"/></a>
<a href="image3.html">Image3<img src="image3.jpg"/></a>
</div>
</body>
</html>
'''

1、导入模块

>>> from lxml import etree

2、构造对象

>>> html = etree.HTML(sc) # 构造 lxml.etree._Element 对象
>>> # lxml.etree._Element 对象还具有代码补全功能
>>> # 假如我们得到的 XML 文档不是规范的文档,该对象将会自动补全缺失的闭合标签
>>> # 我们可以使用 tostring() 方法将对象转化成 bytes 类型的字符串
>>> # 再使用 decode('utf-8') 方法将 bytes 类型的字符串转化为 str 类型的字符串
>>> print(etree.tostring(html).decode('utf-8'))

3、匹配数据

我们可以使用 xpath() 方法进行匹配

(1)xpath 匹配语法

xpath 方法接受一个满足 xpath 匹配语法的字符串作为参数

下面主要介绍一下 xpath 匹配语法:

  • / 表示子代节点,例如 /E 表示匹配根节点下的子节点中的 E 元素节点

    >>> test = html.xpath('/html/head/title')
  • // 表示后代节点,例如 //E 表示匹配根节点下的后代节点中的 E 元素节点

    >>> test = html.xpath('//a')
  • * 表示所有节点,例如 E/* 表示匹配 E 元素节点下的子节点中的所有节点

    >>> test = html.xpath('/html/*')
  • text() 表示文本节点,例如 E/text() 表示匹配 E 元素节点下的子节点中的文本节点

    >>> test = html.xpath('/html/head/title/text()')
  • @ATTR 表示属性节点,例如 E/@ATTR 表示匹配 E 元素节点下的子节点中的 ATTR 属性节点

    >>> test = html.xpath('//a/@href')
  • 谓语 用于匹配指定的标签

    • 指定第二个 <a> 标签

      >>> test = html.xpath('//a[2]')
    • 指定前两个 <a> 标签

      >>> test = html.xpath('//a[position()<=2]')
    • 指定带有 href 属性的 <a> 标签

      >>> test = html.xpath('//a[@href]')
    • 指定带有 href 属性且值为 image1.html 的 <a> 标签

      >>> test = html.xpath('//a[@href="image1.html"]')
    • 指定带有 href 属性且值包含 image 的 <a> 标签

      >>> test = html.xpath('//a[contains(@href,"image")]')

(2)_Element 对象

xpath 方法返回字符串或者匹配列表,匹配列表中的每一项都是 lxml.etree._Element 对象

下面主要介绍一下 _Element 对象的常用属性与方法:

我们先用 xpath 方法得到匹配列表 tests 作为测试样例,tests 中的每一项都是一个 _Element 对象

>>> test = html.xpath('//a[@href="image1.html"]')
>>> obj = test[0]
  • tag 返回标签名
>>> obj.tag
'a'
  • attrib 返回属性与值组成的字典
>>> obj.attrib
{'href': 'image1.html'}
  • get() 返回指定属性的值
>>> obj.get('href')
'image1.html'
  • text 返回文本值
>>> obj.text
'Image1'

【参考资料】

【爬虫系列相关文章】

爬虫系列(九) xpath的基本使用的更多相关文章

  1. 爬虫系列(十) 用requests和xpath爬取豆瓣电影

    这篇文章我们将使用 requests 和 xpath 爬取豆瓣电影 Top250,下面先贴上最终的效果图: 1.网页分析 (1)分析 URL 规律 我们首先使用 Chrome 浏览器打开 豆瓣电影 T ...

  2. 爬虫系列(十一) 用requests和xpath爬取豆瓣电影评论

    这篇文章,我们继续利用 requests 和 xpath 爬取豆瓣电影的短评,下面还是先贴上效果图: 1.网页分析 (1)翻页 我们还是使用 Chrome 浏览器打开豆瓣电影中某一部电影的评论进行分析 ...

  3. 爬虫系列(三) urllib的基本使用

    一.urllib 简介 urllib 是 Python3 中自带的 HTTP 请求库,无需复杂的安装过程即可正常使用,十分适合爬虫入门 urllib 中包含四个模块,分别是 request:请求处理模 ...

  4. 爬虫系列(二) Chrome抓包分析

    在这篇文章中,我们将尝试使用直观的网页分析工具(Chrome 开发者工具)对网页进行抓包分析,更加深入的了解网络爬虫的本质与内涵 1.测试环境 浏览器:Chrome 浏览器 浏览器版本:67.0.33 ...

  5. 爬虫系列(四) 用urllib实现英语翻译

    这篇文章我们将以 百度翻译 为例,分析网络请求的过程,然后使用 urllib 编写一个英语翻译的小模块 1.准备工作 首先使用 Chrome 浏览器打开 百度翻译,这里,我们选择 Chrome 浏览器 ...

  6. 爬虫系列(五) re的基本使用

    1.简介 究竟什么是正则表达式 (Regular Expression) 呢?可以用下面的一句话简单概括: 正则表达式是一组特殊的 字符序列,由一些事先定义好的字符以及这些字符的组合形成,常常用于 匹 ...

  7. 爬虫系列(六) 用urllib和re爬取百度贴吧

    这篇文章我们将使用 urllib 和 re 模块爬取百度贴吧,并使用三种文件格式存储数据,下面先贴上最终的效果图 1.网页分析 (1)准备工作 首先我们使用 Chrome 浏览器打开 百度贴吧,在输入 ...

  8. 爬虫系列(七) requests的基本使用

    一.requests 简介 requests 是一个功能强大.简单易用的 HTTP 请求库,可以使用 pip install requests 命令进行安装 下面我们将会介绍 requests 中常用 ...

  9. 爬虫系列(八) 用requests实现天气查询

    这篇文章我们将使用 requests 调用天气查询接口,实现一个天气查询的小模块,下面先贴上最终的效果图 1.接口分析 虽然现在网络上有很多免费的天气查询接口,但是有很多网站都是需要注册登陆的,过程比 ...

随机推荐

  1. Linux下一款可以使用命令行的pdf阅读器

    Zathura是linux下一款用命令行控制打pdf阅读器,并且基本打使用方法和vim很相似.对于喜欢键盘操作的用户来说的确是一个不错的选择. ubuntu下的安装命令: sudo apt-get i ...

  2. Bitmap通过getWidth和getHeight获取尺寸不符

    在使用BitmapFactory载入图片时,常会出现这样的情况,返回的图片尺寸与实际尺寸不符.这是因为我们把图片资源放到res/drawable文件路径下时,选择的文件不同所致.不同的目录会有不同的缩 ...

  3. Robot Framework 搭建和RIDE(GUI) 的环境

    在windows x64的环境上进行安装,集成Selenium2和AutoIt的libraries,以下安装步骤在win 7,win 8.1,win 10, win 2012 R2上测试通过 1. 下 ...

  4. C# 获得资源文件下图片的路径

    最终实现正确的代码是: button8.Image = System.Drawing.Image.FromFile(@"..\\..\\Resources\\GAOJIBAN.png&quo ...

  5. StackExchange.Redis 使用资料

    在StackExchange.Redis中最重要的对象是ConnectionMultiplexer类, 它存在于StackExchange.redis命名空间中.这个类隐藏了Redis服务的操作细节, ...

  6. 【POJ 1723】 SOLDIERS

    [题目链接] http://poj.org/problem?id=1723 [算法] 中位数 [代码] #include <algorithm> #include <bitset&g ...

  7. 【POJ 3190】 Stall Reservations

    [题目链接] http://poj.org/problem?id=3190 [算法] 将这些牛按开始吃草的时间排序 维护一个数组S,Si表示畜栏i进去的最后一头牛结束吃草的时间,对于每头牛,找任意一个 ...

  8. C语言作用于修饰符

    之前就遇到了坑,莫名其妙报错.   总结下: extern   声明在其他文件里 static     仅当前文件可见

  9. [Swift通天遁地]五、高级扩展-(8)ImageView(图像视图)的各种扩展方法

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  10. Tornado异步模式

    先介绍下背景:由于工作需要,前段时间又写了一段爬虫去获取和更新一些数据.之前爬虫主要用Scrapy框架批量爬取一些页面数据,或者用Gevent调用目标站点的接口.偶然看到了Tornado,听说这个框架 ...