深入学习XPath:解析和提取XML数据的强大工具

1️⃣ 简介

什么是XPath

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

XPath的优点和用途

⭐平台兼容性: 由于XPath是标准化的工具,因此它们在不同的编程语言和操作系统中都可以使用。这意味着您可以在各种环境中应用这些技能。
自动化任务: XPath可以用于自动化任务,例如在网站上查找和更新特定信息,或者从不同来源的XML数据中自动提取和汇总信息。这可以节省大量时间和人力成本。
强大的数据提取: XPat提供了一种强大而灵活的方法,用于从XML和HTML等结构化数据中提取所需信息。无论是从网页抓取数据还是处理XML文件,它们都是不可或缺的工具。
XML和HTML处理: 在处理XML和HTML文档时,XPath是Python中最流行的工具之一。它能够有效地解析这些文档,使您能够轻松地访问和操作其中的元素和属性。
♻数据清洗和转换: 在数据预处理阶段,XPath可用于清洗和转换数据。您可以轻松地过滤、排序、分组和格式化数据,以满足您的需求,使数据变得更容易分析和理解。

XPath在Python中的使用

由于XPath属于lxml库模块,所以首先要安装库lxml。

pip install lxml # 下载lxml库

from lxml import etree
selector=etree.HTML(源码) #将源码转化为能被XPath匹配的格式
selector.xpath(表达式) #返回为一列表

2️⃣ 使用

❗❗ 以下示例中皆用下面的HTML代码

html_doc = """
The Dormouse's story

The Dormouse's story

Once upon a time there were three little sisters; and their names were Elsie, Lacie and Tillie; and they lived at the bottom of a well.

...

"""

这是 爱丽丝梦游仙境 的一段内容(以后内容中简称为 爱丽丝 的文档)

声明:在学习以下内容时,先进行选择器的生成

selector = etree.HTML(html_doc)

路径表达式

表达式 描述 实例 解析
/ 从根节点选取 /body/div[1] 选取根结点下的body下的第一个div标签
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 //a 选取文档中所有的a标签
./ 当前节点再次进行xpath ./a 选取当前节点下的所有a标签
@ 选取属性 //@calss 选取所有的class属性

示例:

# / 
print(selector.xpath('/html/body')) # []

# //
print(selector.xpath('//body')) # []

# ./
select_body = selector.xpath('//body')[0]
print(select_body.xpath('./p')) # [, , ]

# @
print(selector.xpath('//@class')) # ['title', 'story', 'sister', 'sister', 'sister', 'story']

谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在 方括号 中。

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式 结果
/ul/li[1] 选取属于 ul子元素的第一个 li元素。
/ul/li[last()] 选取属于 ul子元素的最后一个 li元素。
/ul/li[last()-1] 选取属于 ul子元素的倒数第二个 li元素。
//ul/li[position()❤️] 选取最前面的两个属于 ul元素的子元素的 li元素。
//a[@title] 选取所有拥有名为 title的属性的 a元素。
//a[@title=‘xx’] 选取所有 a元素,且这些元素拥有值为 xx的 title属性。
//a[@title>10] > < >= <= != 选取 a元素的所有 title元素,且其中的 title元素的值须大于 10。
/body/div[@price>35.00] 选取body下price元素值大于35的div节点

示例:

# Attr
//a[@attr] # 查找属性
//a[@attr="xx"] #查找属性和值

//a[@id] # 查找含有id属性的a标签
//a[@id='link2'] # 查找id=link2的a标签

# 逻辑运算
//a[@id="link2" and @class="sister"] # 查找a元素、条件:id=link2 并且 class=sister
//a[@id='link2' or @class='sister']# 查找a元素、条件:id=link2 或者 class=sister
# ❗值得注意的是:虽然是在字符串内写路径表达式,但是属性值依然需要用引号进行包裹

选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

实例:

路径表达式 结果
/ul/* 选取ul 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。
//node() 获取所有节点

选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
//ol/li| //ul/li 选取 ul、ol元素的所有 li 元素。
//ol| //ul 选取文档中的所有 ol和 ul元素。

模糊查询

//a[contains(@id, "link")]  # 查询所有id属性中包含link的a标签
//a[starts-with(@id, "li")] # 查询所有id属性中包以li开头的a标签
//a/text()  # 查找所有a标签下的内容
//a/@href   # 获取a里面的href属性值 
//*  #获取所有
//*[@class="xx"]  #获取所有class为xx的标签

# 获取节点内容转换成字符串
text = selector.xpath('//p[2]/a')[0]
result = etree.tostring(text, encoding='utf-8')
print(result.decode('UTF-8'))

3️⃣ 网页数据提取示例

页面获取地址:豆瓣电影TOP250

本篇文章只为讲述XPath的应用,案例比较简单,仅用于巩固XPath的使用,所以取页面的时候就直接选择简单粗暴地方法,打开页面后右键 查看网页源代码 ,直接复制存储到本地

获取信息:
深入学习XPath:解析和提取XML数据的强大工具_第1张图片

from lxml import etree

with open('html/douban.html', mode='r', encoding='utf-8') as f:
    selector = etree.HTML(f.read())
    ol = selector.xpath('//ol[@class="grid_view"]')[0] # 获取到电影数据最外层的标签
    # print(ol)
    
    item_list = ol.xpath('.//div[@class="item"]') # 获取每个电影信息外层信息
    
    for item in item_list:
        # print('⭕',item)
        print(item.xpath('.//span[@class="title"]/text()')[0]) # 获取电影名称
        print(item.xpath('.//span[@class="rating_num"]/text()')[0])# 获取电影评分
        # ...更多感兴趣的可以自己尝试呦

4️⃣ 写在最后

本编文章仅展示XPath部分功能,更强大、更有意思的使用方法可详看文档:XPath教程

如果您有任何问题、建议或反馈,欢迎在评论区留言,非常愿意听取您的声音。感谢您的阅读,期待与您在未来的博客分享中再次相会!

你可能感兴趣的:(Python爬虫学习手札,xml,爬虫,学习)