一、使用XPath

XPath ,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言。它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索。

所以在爬虫时,我们完全可以使用XPath来做相应的信息提取。本次随笔中,我们就介绍XPath的基本用法。

1.XPath概览

XPath的选择功能十分强大,它提供了非常简洁明了的路径选择表达式。另外,它还提供了超过100个内建函数,用于字符串、数值、时间的匹配以及节点。序列的处理等。几乎所有我们想要定位的节点,都可以用XPath来选择。

XPath与1999年11月16日成为W3C标准,它被设计为供XSLT/XPointer以及其他XML解析软件使用,更多的文档可以访问其官方网站:http://www.w3school.com.cn/xpath/index.asp

2.XPath 常用规则

我列举了几个常用规则:

表达式 描述
nodename 选取此节点的所有子节点
/ 从当前节点选取直接子节点
// 从当前节点选取子孙节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

这里列举出XPath的常用匹配规则,示例如下:

//title[@lang='eng']

这就是一个XPath规则,它代表选择所有名称为title,同时属性lang的值为eng的节点。

后面会通过Python的lxml库,利用XPath进行HTML 的解析。

3.准备工作

使用之前要安装好lxml库

4.实例引入

现在通过实例来感受一下使用XPath来对网页进行解析的过程,相关代码如下:

省略

首先我们导入 from lxml import etree ,然后声明了一段HTML 文本,调用HTML类进行初始化,这样就成功构造了一个XPath解析对象。需要注意的是etree模块可以自定修正HTML文本。

这里我们调用tosting()方法即可输出修正后的HTML文本,但是结果是bytes类型。这里利用decode()方法将其转成str类型。

另外,也可以直接读取文本文件进行解析。

5.所有节点

我们一般会用//开头的XPath规则来获取所有符合要求的节点。

*代表匹配所有节点,也就是整个HTML文本中的所有节点都会被获取。返回形式是一个列表,每一个元素是Element类型,其后跟了节点的名称,如html、body、div、ul、li、a等,所有节点都包含在列表中了。

当然,匹配也可以指定节点名称。//后直接加上节点名称即可。,列表获取其中直接用中括号加索引。

6.子节点

我们通过/或//即可查找元素的子节点或者子孙节点。

result = html.xpath('//li/a')

这里通过追加/a即选择了所有li节点的所有直接a子节点。因为//li用于选中所有li节点,/a用于选中li节点的所有直接子节点a,二者组合在一起即获取所有li节点的所有直接a子节点。

此处的/用于获取直接子节点,如果想要获取所有子孙节点,就可以使用//。

result = html.xpath('//ul//a')

7.父节点

我们知道通过/或//即可查找元素的子节点或者子孙节点,那么假如我们知道了自己子节点,怎样来查找父节点呢?

比如,现在首先选中href属性为link4.html的a节点,然后再获取其父节点,然后再获取其class属性

result = html.xpath('//a[@href=link4.html"]/../@class')

同时我们也可以通过parent::来获取父节点

result = html.xpath('//a[@href=link4.html"]/parent::*/@class')

8.属性匹配

在获取的时候,我们还可以用@符号进行属性过滤。比如,如果要选取class为item-0的li节点。

result = html.xpath('//li[@class="item-0"]')

这里我们通过加入[@class="item-0"],限制了节点的class属性为item-0,而HTML 文本中符合条件的li节点有两个,会返回出符合的,至于正不正确,后面在验证。

9.文本获取

我们用XPath中的text()方法获取节点中的文本,接下来尝试获取前面li节点中的文本

result = html.xpath('//li[@class="item-0"]/text()')

奇怪的是,我们并没有获取到任何文本,只获取到了一个换行符,这是为什么呢?因为XPath中text()前面是/,而此处/的含义是选取直接子节点,很明显li的直接子节点都是a节点。文本都是在a节点内部的,所以这里匹配到的结果就是被修正的li节点内部的换行符,因为自动修正的li节点的为标签换行了。

因此想要获取li字节内部的文本,就有两种方式,一种就是先选取a节点再获取文本,另一种就是使用//。接下来,我们来看一下二者的区别。

第一种:

首先获取a节点再获取文本

10.属性获取

有时候,某些节点的某个属性可能有多个值

@符号

11.属性多值获取

用contains()函数,第一个参数传入属性名称,第二个参数传入属性值。只要此属性包含所传入的属性值,就可以完成匹配了。

12.多属性匹配

另外,我们还坑遇到一种情况,那就是根据多个属性确定一个节点,这时候就需要同时匹配多个属性。

运算符及其介绍

运算符 描述 实例 返回值
or age=19 or age=20 如果age是19,则返回true。如果age是21,则返回false
and age>19 and age <21 如果age是20,则返回true。如果age是18,则返回false
mod 计算除法的余数 5 mod 2 1
| 计算两个节点集 //book | //cd 返回所有拥有book跟cd元素的节点集
+ 加法 6+4 10
- 减法 6-4 2
* 乘法 6*4 24
div 除法 8 div 4 2
= 等于 age-=19 如果age是19,则返回true,如果age是20,则返回false
!= 不等于 age1=19 如果age是18则返回true,如果age是19,则返回false
> 大于 age>19  
>= 大于或等于 age>=19  
< 小于 age<19  
<= 小于或等于 age<=19  

13.顺序选择

有时候,我们在选择的时候某些属性可能同时匹配了多个节点,但是只想要其中的某个节点,如第二个节点或者最后一个节点,该怎么办?

这时候可以利用中括号传入索引的方法获取特定次序的节点

14.节点轴选择

子元素、兄弟元素、父元素、祖先元素,

15.结语

好好学习,天天向上

Python 爬虫 解析库的使用 --- XPath的更多相关文章

  1. Python 爬虫 解析库的使用 --- Beautiful Soup

    知道了正则表达式的相关用法,但是一旦正则表达式写的有问题,得到的可能就不是我们想要的结果了.而且对于一个网页来说,都有一定的特殊结构和层级关系,而且有很多节点都有id或class来做区分,所以借助它们 ...

  2. python爬虫解析库之Beautifulsoup模块

      一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会 ...

  3. python爬虫解析库学习

    一.xpath库使用: 1.基本规则: 2.将文件转为HTML对象: html = etree.parse('./test.html', etree.HTMLParser()) result = et ...

  4. python爬虫解析库之re模块

    re模块 一:什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则.(在Python中)它内嵌在Python中, ...

  5. 爬虫解析库:XPath

    XPath     XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言.最初是用来搜寻 XML 文档的,但同样适用于 HTML 文档的 ...

  6. XPath 爬虫解析库

    XPath     XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言.最初是用来搜寻 XML 文档的,但同样适用于 HTML 文档的 ...

  7. Python网页解析库:用requests-html爬取网页

    Python网页解析库:用requests-html爬取网页 1. 开始 Python 中可以进行网页解析的库有很多,常见的有 BeautifulSoup 和 lxml 等.在网上玩爬虫的文章通常都是 ...

  8. python爬虫---selenium库的用法

    python爬虫---selenium库的用法 selenium是一个自动化测试工具,支持Firefox,Chrome等众多浏览器 在爬虫中的应用主要是用来解决JS渲染的问题. 1.使用前需要安装这个 ...

  9. Python爬虫Urllib库的高级用法

    Python爬虫Urllib库的高级用法 设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Head ...

随机推荐

  1. day1-pycharm使用

    1.Ctrl+滑轮 字体大小 2.改变字体大小 3.开头模板 4.多行注释 ctrl+? 5.切换Python版本解释器

  2. IDEA+TestNG

    1.常用注解 2.手把手教你掌握必备测试框架testNG:http://www.51testing.com/zhuanti/TestNG.htm [testNG常用注解] 1 @Test:标记一个类或 ...

  3. 初学Python——软件目录结构规范

    为什么要设计好目录结构? 可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等.从而非常快速的了解这个项目. 可维护性高: 定义好组织 ...

  4. python中numpy.pad简单填充0用法

    # -*- coding: utf-8 -*-"""Created on Sun Apr 28 22:07:02 2019 @author: jiangshan" ...

  5. adaboost-笔记(1)

    1 - 加法模型 加法模型,就是通过训练集不断的得到不同的分类器(回归),然后将这些分类器组合成一个新的分类器的过程. 假设有\(N\)个样本,且我们的加法模型如下: \[f(x)=\sum_{m=1 ...

  6. ajax请求基于restFul的WebApi(post、get、delete、put)

    近日逛招聘软件,看到部分企业都要求会编写.请求restFul的webapi.正巧这段时间较为清闲,于是乎打开vs准备开撸. 1.何为restFul? restFul是符合rest架构风格的网络API接 ...

  7. vue better-scroll用法

    滚动位置固定:在vue中通过路由切换页面时组件会自动滚动到顶部,需要监听滚动行为才能让滚动位置固定,better-scroll解决了这个问题. 常用效果:移动端很常见的效果,当滑动右边部分的时候,左边 ...

  8. 第十二次oo作业

    作业十二 规格化设计简介 规格化设计的发展历史 1950年代,第一次分离,主程序与子程序的分离结构是树状模型,子程序可先于主程序编写.通过使用库函数来简化编程,实现最初的代码重用.产生基本的软件开发过 ...

  9. Jenkins - 构建Allure Report

    前言 本文为Pytest+Allure定制报告进阶篇,集成Jenkins,在Jenkins中直接生成报告,更方便测试人员查看. 一.安装插件allure-jenkins-plugin 1.进入系统管理 ...

  10. HDU - 1255 扫描线+离散化进阶

    这道题最开始我以为和HDU - 1542 那道题一样,只需要把cover次数改成2次即可,但是后面仔细一想,我们需要求的是覆盖次数大于等于2次的,这样的话,我们需要维护两个长度,HDU-1542 由于 ...