Python从0到100(三十三):xpath和lxml类库
1. 为什么要学习xpath和lxml
lxml是一款高性能的 Python HTML/XML 解析器,我们可以利用XPath,来快速的定位特定元素以及获取节点信息
2. 什么是xpath
XPath,全称为XML Path Language,是一种用于在XML文档中进行导航和数据提取的语言,可用来在 HTML\XML 文档中对元素和属性进行遍历。
W3School官方文档:http://www.w3school.com.cn/xpath/index.asp
3. 认识xml
知识点:
- html和xml的区别
- xml中各个元素的的关系和属性
3.1 html和xml的区别
HTML(HyperText Markup Language)和XML(eXtensible Markup Language)都是用于描述数据的标记语言,但它们之间存在一些关键的区别:
-
目的:
- HTML:设计用来创建和展示网页内容。
- XML:设计用来存储和传输数据,不定义数据的显示方式。
-
标准性:
- HTML:有固定的标签集,如
<p>
、<div>
、<a>
等。 - XML:允许用户定义自己的标签,提供了极大的灵活性。
- HTML:有固定的标签集,如
-
结构性:
- HTML:结构相对宽松,某些标签可以不闭合或不严格遵守嵌套规则。
- XML:非常严格,所有标签必须正确闭合,并且必须正确嵌套。
-
数据表示:
- HTML:主要用于展示数据,不关注数据的结构和语义。
- XML:强调数据的结构和语义,适合数据的存储和交换。
-
样式和行为:
- HTML:可以内嵌CSS和JavaScript来控制样式和行为。
- XML:不包含样式和行为的定义,通常需要与XSL(eXtensible Stylesheet Language)或XSLT(eXtensible Stylesheet Language Transformations)结合使用来定义样式和转换数据。
-
错误容忍度:
- HTML:浏览器对HTML的错误相对宽容,即使某些标签使用不当,页面仍可能显示。
- XML:对错误非常敏感,如果XML文档格式有误,通常无法被正确解析。
-
文档类型:
- HTML:通常不需要文档类型声明(DOCTYPE)或可以有简化的声明。
- XML:每个XML文档都需要一个文档类型声明来指示使用的是XML。
-
应用范围:
- HTML:主要用于网页设计和开发。
- XML:应用范围广泛,包括配置文件、数据交换格式、RSS feeds等。
-
命名空间:
- HTML:不支持命名空间。
- XML:支持命名空间,有助于解决不同XML文档中标签名称冲突的问题。
-
扩展性:
- HTML:扩展性有限,受限于其固定的标签集。
- XML:高度可扩展,用户可以根据需要创建新的标签和属性。
尽管HTML和XML在某些方面相似,但它们的设计目标和使用方式有着根本的不同。HTML专注于网页内容的展示,而XML则是一种更为通用的数据交换格式。
3.2 xml的树结构
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
4. xpath的节点关系
知识点:
- 认识xpath中的节点
- 了解xpath中节点之间的关系
4.1 xpath中的节点是什么
每个XML的标签我们都称之为节点,其中最顶层的节点称为根节点。
XPath(XML Path Language)是一种用于在XML文档中进行导航的语言,它允许你选择节点或节点集,并对它们进行操作。在XPath中,节点是文档结构的基本单元,包括以下几种类型:
- 元素节点:XML文档中的标签,如
<book>
、<title>
等。 - 属性节点:元素的属性,如
<book lang="English">
中的lang="English"
。 - 文本节点:元素内的文本内容,如
<name>John Doe</name>
中的John Doe
。 - 命名空间节点:XML文档中的命名空间声明。
- 处理指令节点:XML文档中的处理指令,如
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
。 - 注释节点:XML文档中的注释部分。
- 根节点:XML文档的根元素,它是所有其他节点的父节点。
4.2 xpath中节点的关系
在XPath中,节点之间的关系可以描述如下:
- 父节点:一个节点的直接上级节点。例如,在
<parent><child/></parent>
中,<parent>
是<child>
的父节点。 - 子节点:一个节点的直接下级节点。在上述例子中,
<child>
是<parent>
的子节点。 - 兄弟节点:具有相同父节点的节点。例如,在
<parent><child1/><child2/></parent>
中,<child1>
和<child2>
互为兄弟节点。 - 祖先节点:从当前节点向上直到根节点的所有节点。例如,在
<grandparent><parent><child/></parent></grandparent>
中,<grandparent>
和<parent>
都是<child>
的祖先节点。 - 后代节点:从当前节点向下直到最后一个子节点的所有节点。在上述例子中,
<child>
是<grandparent>
和<parent>
的后代节点。 - 前序节点:包括当前节点及其所有祖先节点。
- 后序节点:包括当前节点及其所有后代节点。
- 轴:XPath中用于描述节点之间关系的术语,如子轴(child axis)、父轴(parent axis)、祖先轴(ancestor axis)和后代轴(descendant axis)等。
XPath提供了丰富的路径表达式和函数,允许用户根据这些节点关系来选择和操作XML文档中的特定部分。例如,使用//
可以选取文档中的所有后代节点,无论它们位于文档的哪个位置。使用/
可以选取根节点的子节点,而.
代表当前节点。
5. xpath中节点选择的工具
- Chrome插件 XPath Helper
- 下载地址:https://pan.baidu.com/s/1UM94dcwgus4SgECuoJ-Jcg 密码:337b
- 把文件的后缀名crx改为rar,然后解压到xpath_…
- 把解压后的文件夹拖入到已经开启开发者模式的chrome浏览器扩展程序界面
- 重启浏览器
- Firefox插件 XPath Checker
注意:
这些工具是用来学习xpath语法的,他们都是从elements中匹配数据,elements中的数据和url地址对应的响应不相同,所以在代码中,不建议使用这些工具进行数据的提取
6. xpath语法
知识点
- 掌握元素路径的相关方法
- 掌握获取获取属性的方法
- 掌握获取文本的方法
我们将在下面的例子中使用这个 XML 文档。
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
6.1 选取节点
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
使用chrome插件选择标签时候,选中时,选中的标签会添加属性class="xh-highlight"
下面列出了最有用的表达式:
表达式 | 描述 |
---|---|
nodename | 选中该元素。 |
/ | 从根节点选取、或者是元素和元素间的过渡。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
… | 选取当前节点的父节点。 |
@ | 选取属性。 |
text() | 选取文本。 |
实例
在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:
路径表达式 | 结果 |
---|---|
bookstore | 选择bookstore元素。 |
/bookstore | 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径! |
bookstore/book | 选取属于 bookstore 的子元素的所有 book 元素。 |
//book | 选取所有 book 子元素,而不管它们在文档中的位置。 |
bookstore//book | 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。 |
//book/title/@lang | 选择所有的book下面的title中的lang属性的值。 |
//book/title/text() | 选择所有的book下面的title的文本。 |
xpath基础语法练习:
接下来我们听过豆瓣电影top250的页面来练习上述语法
- 选择所有的h1下的文本
//h1/text()
- 获取所有的a标签的href
//a/@href
- 获取html下的head下的title的文本
/html/head/title/text()
- 获取html下的head下的link标签的href
/html/head/link/@href
但是当我们需要选择所有的电影名称的时候会特别费力,通过下一小节的学习,就能够解决这个问题
6.2 查找特定的节点
路径表达式 | 结果 |
---|---|
//title[@lang=“eng”] | 选择lang属性值为eng的所有title元素 |
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()>1] | 选择bookstore下面的book元素,从第二个开始选择 |
//book/title[text()=‘Harry Potter’] | 选择所有book下的title元素,仅仅选择文本为Harry Potter的title元素 |
/bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
注意点:
在xpath中,第一个元素的位置是1,最后一个元素的位置是last(),倒数第二个是last()-1
6.3 选取未知节点
XPath 通配符可用来选取未知的 XML 元素。
通配符 | 描述 |
---|---|
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
node() | 匹配任何类型的节点。 |
实例
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
路径表达式 | 结果 |
---|---|
/bookstore/* | 选取 bookstore 元素的所有子元素。 |
//* | 选取文档中的所有元素。 |
//title[@*] | 选取所有带有属性的 title 元素。 |
6.3 选取若干路径
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
实例
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
路径表达式 | 结果 |
---|---|
//book/title | //book/price | 选取 book 元素的所有 title 和 price 元素。 |
//title | //price | 选取文档中的所有 title 和 price 元素。 |
/bookstore/book/title | //price | 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。 |
小结
- xpath的概述XPath (XML Path Language),解析查找提取信息的语言
- xml是和服务器交互的数据格式和json的作用一致
- html是浏览器解析标签数据显示给用户
- xpath的节点关系:根节点,子节点,父节点,兄弟节点,子节点,后代节点
- xpath的重点语法获取任意节点:
//
- xpath的重点语法根据属性获取节点:
标签[@属性 = '值']
- xpath的获取节点属性值:
@属性值
- xpath的获取节点文本值:
text()
- 点赞
- 收藏
- 关注作者
评论(0)