18910140161

网页解析工具终结篇xpath语法

顺晟科技

2021-06-16 10:43:06

270

写在前面

山竹(难怪都说越漂亮的东西越危险,这么美的名字下这么野)终于过去了,囤货泡面的日子真难受。希望上帝保佑中国,不要有大风!这篇文章将告诉你xpath,一个相关的网页解析工具。如果您熟悉文档路径结构,xpath是掌握网页解析的一种简单方法,这也是边肖将它放在上一系列网页解析文章中的原因之一。边肖总是认为学习东西必须先把难的东西啃掉,然后掌握简单的东西(或者在这个时候,你只需要更少的时间来掌握简单的知识)。废话就不多说了,下面正式开始介绍这篇文章。

xpath简介

XPath,XML Path Language的全称,是XML路径语言,是一种在XML文档中搜索信息的语言。XPath虽然是为了搜索XML文档而设计的,但是在HTML文档中也可以很好的工作,而且大部分浏览器也支持通过XPath查询节点。由于XPath被称为路径,它以路径表达式的形式指定元素,这与我们在传统计算机文件系统中看到的非常相似。XPath选择非常强大,它提供了非常简洁明了的路径选择表达式。此外,它还提供了100多个内置函数,用于匹配字符串、值和时间,以及处理节点和序列。几乎所有你想定位的节点都可以通过XPath选择。关于xpath的完整而详细的介绍,请参考官方文件https://www.w3.org/TR/xpath/.

Xpath语法主要表现两点:节点和到达节点的路径语法。考虑到路径语法中不仅有路径,还有等价路径和多条件路径,所以xpath语法具体分四部分介绍:xpath节点、xpath基本路径、xpath轴、xpath运算符。最后,文章以一个实例结束。

Xpath节点

在XPath中,XML文档被视为具有七种类型节点的节点树:元素、属性和文本

Ben、名称空间、处理指令、注释和文档(根)节点。树的根被称为文档节点或根节点。以下面的XML文档为例。文件如下:

?xml版本='1.0 '编码='ISO-8859-1 '?

教室

学生

idl001/id

name lang='en' marry /name

20岁/年龄

中国/

/学生

/教室

XML文档中的上述节点包括:(文档节点)、100l(元素节点)、lang="en "(属性节点)、marry(文本)。然后说节点关系,包括父节点、子节点、兄弟节点、祖先节点和后代节点。在上述文件中:

学生元素是id、姓名、年龄和元素的父元素。

元素id、名称、年龄和都是学生元素的子元素。

元素id、名称、年龄和都是具有相同父节点的兄弟节点。

名称元素的祖先是学生元素和教室元素。

教室的后代是id、姓名、年龄和元素。

Xpath基本路径选择

XPath使用路径表达式来选择XML文件中的节点或节点集。沿着路径或步骤选择节点。接下来重点是如何选择节点。下面是一个用于分析的XML文档:

?xml版本='1.0 '编码='ISO-8859-1 '?

教室

学生

id1001/id

name lang='en'marry /name

20岁/年龄

中国/

/学生

学生

id1002/id

name lang='en'jack /name

25岁/年龄

美国/

/学生

/教室

以下是xpath中常用的一些路径选择规则:

表达式描述

节点名选择该节点下的所有节点

/选择当前节点下的子节点

//选择当前节点下的所有后代节点。选择当前节点

.选择当前节点的父节点

@选择属性

然后,这些选择规则被用来演示上面给出的xml文档的选择。

路径表达式选择结果

教室选择教室元素的所有子节点

/教室选择根元素教室

/教室/学生选择属于教室的所有学生子元素

//学生选择所有学生子元素,无论它们在文档中的位置如何

/教室//学生选择属于教室元素后代的所有学生元素,无论它们位于教室下面的什么位置

//@lang选择所有名为lang的属性

以上例子达到的效果是所有符合条件的节点都被选中,但是如何选择一个特定的节点或者包含指定值的节点呢?这需要使用嵌入在方括号中的谓词,如下例所示。

路径表达式选择结果

/教室/学生[1]选择属于教室元素的个学生子元素

/教室/学生[last()]选择属于教室元素的最后一个学生子元素

/教室/学生[last()-1]选择属于教室元素的倒数第二个学生子元素

/教室/学生[位置(3)]选择属于教室元素的前两个学生子元素

//name[@lang]选择属性为lang的所有name元素

//name [@ lang="en"]选择所有name元素,这些元素具有值为en的lang属性

/教室//学生[年龄20]选择教室元素的所有学生元素,年龄元素的值必须大于20

/教室//学生[age20]/name选择教室元素中学生元素的所有名称元素,并且age元素的值必须大于20

XPath还可以在选择节点时使用通配符“*”匹配所有未知元素,并使用运算符|一次选择多个路径,如下例所示。

路径表达式选择结果

/教室/*选择教室元素的所有子元素

//*选择文档中的所有元素

//name[@*]选择所有带属性的名称元素

//student/name | //studengt/age选择该元素的所有姓名和年龄元素

/教室/学生/姓名|//年龄选择属于教室元素的学生元素的所有姓名元素和文档中的所有年龄元素

Xpath轴

轴定义了选定节点和当前节点之间的树关系。在Python爬虫开发中,从网页中提取信息

会出现先提取一个节点的信息,再基于这个节点提取子节点或者父节点,然后使用轴的概念的情况。轴的存在使得提取更加灵活准确。

在讲轴的用法之前,我们需要知道位置路径表达式中的相对位置路径、位置路径和步长

概念。位置路径可以是的,也可以是相对的。路径以正斜杠(/)开头,而相对路径不是。在这两种情况下,定位路径都包括一个或多个步骤,每个步骤都用斜线分开:/step/step/……(定位路径)、step/step/……(相对定位路径)。

步骤包括:轴、节点测试、零个或多个谓词,用于进一步细化所选节点集。步骤的语法是:轴名:节点测试[谓词]。下面给出了axis的语法规则。

轴名称含义

子元素选择当前节点的所有子元素

子节点选择当前节点的父节点

祖先选择所有祖先(父亲、祖父等。)的当前节点

祖先或自我选择所有的祖先(父亲、祖父等。)和当前节点本身

后代选择所有后代元素(子元素、孙元素等)。)的当前节点

后代或自我选择所有后代元素(子元素、孙元素等)。)和当前节点本身

前面选择文档中当前节点开始标记之前的所有节点

跟随选择文档中当前节点结束标记后的所有节点

previous-同级选择当前节点之前的所有同级节点

跟随-同级选择当前节点之后的所有同级节点

Self选择当前节点之后的所有兄弟节点

属性选择当前节点的所有属性

命名空间选择当前节点的所有命名空间节点

再一次,一个xml文档被作为一个演示例子给出。

?xml版本='1.0 '编码='ISO-8859-1 '?

教室

学生

id1001 /id

name lang='en'marry /name

20岁/年龄

中国/

/学生

学生

id1002 /id

name lang='en'jack /name

25岁/年龄

美国/

/学生

教师

classidl/classid

name lang='en'tom /name

50岁/年龄

美国/

/老师

/教室

路径表达式选择结果

选择教师节点/教室/儿童:当前教室节点中子元素的教师

选择所有时间节点的父节点////id/parent : * *

选择classid为子节点的所有祖先节点////class id/ancestor : * *

选择教室节点/教室/后代:3360 *下的所有后代节点

选择所有以学生为父节点//学生/后代id的id元素:3360

选择所有类标识元素//类标识/祖先或自身的祖先节点及其自身:3360 *

选择/教室/学生本身和所有后代元素/教室/学生/后代或自我:3360 *

选择前/教室/教师的所有兄弟节点,结果是选择了所有学生节点/教室/教师/前-兄弟:3360 *

选择/教室中第二个学生之后的所有对等节点,结果是教师节点/教室/学生[2]/以下-同级:3360 *

Xpath运算符

XPath表达式可以返回节点集、字符串、逻辑值和数字。相关运算符如下。

运算符定义实例含义

|计算两个节点集//学生/姓名|//学生/年龄选择学生元素的所有姓名和年龄元素

,-,*,div,mod加法,减法,乘法,除法,余数/教室/学生[age=l9 1]选择教室元素的所有学生元素,age元素的值必须等于20

=,=,=,=等于,不等于,小于,大于,小于或等于/教室/学生[age20]选择教室元素的所有学生元素,age元素的值必须小于20

或、和或、和/教室/学生[年龄20和年龄25]选择教室元素的所有学生元素,其中年龄元素的值必须大于20且小于25

例子

在python中使用xpath时,需要导入lxml库。如果没有安装,可以自己谷歌一下,安装后可以正常使用xpath选择器。首先,给出一个html代码文本,然后演示如何使用xpath获取数据。

文本=' ' '

差异

保险商实验所

Li class=' item-0 ' a href=' linkl . html '项/a/li

Li class=' item-1 ' a href=' link 2 . html '第二项/a/li

Li class=' item-inactive ' a href=' link 3 . html '第三项/a/li

Li class=' item-1 ' a href=' link 4 . html '第四项/a/li

Li class=' item-0 ' a href=' links . html '第五项/a/li

/ul

/div

'''

从lxml导入etree

html=etree。超文本标记语言(文本)

first _ item=html . XPath('/ul/Li[1]/text()')

打印(项)

步是从lxml库中导入etree子模块,然后利用etree子模块中的HTML函数初始化网页代码,再利用etree子模块中的xpath函数根据路径选择元素。这里,应该选择个li元素下的文本内容,所以/ul/li[1]用于首先定位个li元素,然后使用text()函数获得文本内容。通过这个小例子,你应该知道xpath在网页解析中的快速性。

附言

本文到此结束。本期我和大家聊了xpath语法和lxml解析库的用法,学习了如何在lxml库中使用xpath函数来获取网页中的相关内容。本文将是最后一个网页解析工具,lxml将成为一个与漂亮的输出和正则表达式一起编辑网页的工具。希望你至少能掌握一个。最后,再次感谢大家的支持和鼓励。贵公司是边肖进步的动力。

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航