一、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. C 符号表导出

    编译符号表导出示例: 使用GCC编译链接参数--version-script 控制动态符号表,如想 使用链接参数 --retain-symbols-file 控制静态符号表,--version-scr ...

  2. codeforce 1073E. Segment Sum

    看到这个就是数位DP了,然而细节极多,对于i=1状态直接判了,还有最后一位直接算了 设f[i][zt][0/1]表示枚举到第i位,用了那些数字,是否有前导0(前导0不计入数字,否则就不知道后面有没有0 ...

  3. Hybrid 开发

    主讲人:吴彬 要学习某个东西之前,我们首先要了解这个东西是什么?然后我们要了解这东西有什么用,有什么好处和弊端?最后我们要知道这东西怎么用? 简单点就是 ——是什么?有什么用?怎么用? 那么进入正题 ...

  4. 交换排序(2)——冒泡排序(bubble sort)

    冒泡排序算法的运作如下:(从后往前) 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所 ...

  5. git-更改本地和远程分支的名称

    git branch -m old_branch new_branch # Rename branch locally git push origin :old_branch # Delete the ...

  6. E20170925-hm

    arc  n. 综合症状; 弧(度); 天穹; 电弧,弧光.; vi. 形成拱状物; 循弧线行进; wrap  vt. 包; 缠绕; 用…包裹(或包扎.覆盖等); 掩护;            n. ...

  7. 最全的C/C++入门到进阶的书籍推荐,你需要嘛?

    编程是操作性很强的一门知识,看书少不了,但只有学习和实践相结合才能起到很好的效果,一种学习方法是看视频->看书->研究书中例子->自己做些东西->交流->看书. 研究经典 ...

  8. Mobile

    模块===包   传统开发:整个网页我们写了一个js文件,所有的特效都写在里面了. 缺点:耦合度太高,代码关联性太强,不便于后期维护,会造成全局污染. 发生的请求次数过多,依赖模糊,难于维护. 以上都 ...

  9. jeecg中列表查询数据关联其他表的显示

    1.A表字段:id,name;B表字段:id,name,fid(A表外键),现查询A表和B表的所有数据并且查询条件A,B都有,在前台页面list显示 2.后台方法: @RequestMapping(p ...

  10. BZOJ 3779 LCT 线段树 DFS序 坑

    hhhh抄了半天lty代码最后T了  对拍也没事.. 药丸 mine #pragma GCC optimize("O3") //By SiriusRen #include < ...