06.数据解析-xpath

news/2024/7/19 11:36:50 标签: python, 爬虫, 数据解析

1、什么是xpath

XPath (XML Path Language) 是一门在 HTML\XML 文档中查找信息的语言,可用来在 HTML\XML 文档中对元素和属性进行遍历

W3School官方文档:http://www.w3school.com.cn/xpath/index.asp

2、认识xml

知识点:

  • html和xml的区别
  • xml中各个元素的的关系和属性

2、1 html和xml的区别

在这里插入图片描述

2、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>

上面的xml内容可以表示为下面的树结构

上面的这种结构关系在xpath被进一步细化

3、xpath的节点关系

知识点:

  • 认识xpath中的节点
  • 了解xpath中节点之间的关系
  • 每个html的标签我们都称之为节点。(根节点、子节点、同级节点)

4、xpath语法

XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。

下面列出了最有用的表达式:

表达式描述
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的文本。
  • 选取未知节点
通配符描述
*匹配任何元素节点。
@*匹配任何属性节点。
node()匹配任何类型的节点。

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

路径表达式结果
/bookstore/*选取 bookstore 元素的所有子元素。
//*选取文档中的所有元素。
//title[@*]选取所有带有属性的 title 元素。
  • 案例

            <div> 
                <ul> 
                    <li class="item-1">
                        <a href="link1.html">第一个</a>
                    </li> 
                    
                    <li class="item-2">
                        <a href="link2.html">第二个</a>
                    </li> 
                    
                    <li class="item-3">
                        <a href="link3.html">第三个</a>
                    </li> 
                    
                    <li class="item-4">
                        <a href="link4.html">第四个</a>
                    </li> 
                    
                    <li class="item-5">
                        <a href="link5.html">第五个</a> 
                    </li>
                </ul>
            </div>
    
    python">import parsel  # str --> Selector对象   具有xpath方法   提取到的数据返回一个列表
    
    html_str = """
            <div> 
                <ul> 
                    <li class="item-1">
                        <a href="link1.html">第一个</a>
                    </li> 
                    
                    <li class="item-2">
                        <a href="link2.html">第二个</a>
                    </li> 
                    
                    <li class="item-3">
                        <a href="link3.html">第三个</a>
                    </li> 
                    
                    <li class="item-4">
                        <a href="link4.html">第四个</a>
                    </li> 
                    
                    <li class="item-5">
                        <a href="link5.html">第五个</a> 
                    </li>
                </ul>
            </div>
        """
    # 1、转换数据类型
    # data = parsel.Selector(html_str).extract()  # parsel能够把缺失的html标签补充完成
    data = parsel.Selector(html_str)  # parsel能够把缺失的html标签补充完成
    # 2、解析数据--list类型
    # print(data)
    # 2、1 从根节点开始,获取所有<a>标签
    result = data.xpath('/html/body/div/ul/li/a').extract()
    # 2、2 跨节点获取所有<a>标签
    result = data.xpath('//a').extract()
    # 2、3 选取当前节点   使用场景:需要对选取的标签的下一级标签进行多次提取
    result = data.xpath('//ul')
    result2 = result.xpath('./li').extract()    # 提取当前节点下的<li>标签
    result3 = result.xpath('./li/a').extract()  # 提取当前节点下的<a>标签
    # 2、4 选取当前节点的父节点,获取父节点的class属性值
    result = data.xpath('//a')
    result4 = result.xpath('../@class').extract()
    # 2、5 获取第三个<li>标签的节点(两种方法)
    result = data.xpath('//li[3]').extract()
    result = data.xpath('//li')[2].extract()
    # 2、6 通过定位属性的方法获取第四个<a>标签
    result = data.xpath('//a[@href="link4.html"]').extract()
    # 2、7 用属性定位标签,获取第四个<a>标签包裹的文本内容
    result = data.xpath('//a[@href="link4.html"]/text()').extract()
    # 2、8 获取第五个<a>标签的href属性值
    result = data.xpath('//li[5]/a/@href').extract()
    # 了解 模糊查询
    result = data.xpath('//li[contains(@class,"it")]').extract()
    # 同时获取<li>标签的属性以及<a>标签的文本
    # result = data.xpath('//li/@class|//a/text()').extract()
    
    print(result)
    
  • 如何选取多个标签?

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

6、小结

  1. xpath的概述XPath (XML Path Language),解析查找提取信息的语言
  2. xpath的节点关系:根节点,子节点,同级节点
  3. xpath的重点语法获取任意节点://
  4. xpath的重点语法根据属性获取节点:标签[@属性 = '值']
  5. xpath中获取节点的文本:text()
  6. xpath的获取节点属性值:@属性名

@拓展知识

转义字符

在需要在字符中使用特殊字符时,python 用反斜杠转义字符。如下表:

转义字符描述
\(在行尾时)续行符
\反斜杠符号
\'单引号
\"双引号
\a响铃
\b退格(Backspace)
\e转义
\000
\n换行
\v纵向制表符
\t横向制表符
\r回车
\f换页
\oyy八进制数,yy代表的字符,例如:\o12代表换行
\xyy十六进制数,yy代表的字符,例如:\x0a代表换行
\other其它的字符以普通格式输出
原始字符串

由于字符串中的反斜线都有特殊的作用,因此当字符串中包含反斜线时,就需要使用转义字符 \ 对字符串中包含的每个 “” 进行转义。

比如说,我们要写一个关于 Windows 路径 G:\publish\codes\02\2.4 这样的字符串,如果在 Python 程序中直接这样写肯定是不行的,需要使用 \ 转义字符,对字符串中每个 ‘’ 进行转义,即写成 G:\publish\codes\02\2.4 这种形式才行。

有没有觉得这种写法很啰嗦,有没有更好的解决办法呢?答案是肯定的,借助于原始字符串可以很好地解决这个问题。

原始字符串以“r”开头,它不会把反斜线当成特殊字符。因此,上面的 Windows 路径可直接写成如下这种形式:

# 原始字符串包含的引号,同样需要转义
s2 = r'"Let\'s go", said Charlie'
print(s2)

http://www.niftyadmin.cn/n/5070827.html

相关文章

口袋参谋:如何提升宝贝流量?这三种方法超实用!

​你的店铺能不能出爆款&#xff1f;提升单品流量是关键。 对于新手卖家来说&#xff0c;是缺乏运营技巧和运营经验的&#xff0c;运营技巧主要体现在标题写作、各种图片和视频制作等。 由于新手买家没有经验&#xff0c;习惯于直接使用数据包上传&#xff0c;导致宝贝没有展…

小程序 词云图 echarts-for-weixin-wordcloud

GitHub - clydee-geng/echarts-for-weixin-wordcloud: echarts词云微信小程序版 这个是适配与小程序版的词云图&#xff0c;之前有找到ucharts来代替&#xff0c;但是ucharts的词云图功能有两个缺点&#xff1a;1.无法根据值的大小显示词云图的大小&#xff1b;2.显示的顺序是…

软考 系统架构设计师系列知识点之软件质量属性(2)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之软件质量属性&#xff08;1&#xff09; 这个十一注定是一个不能放松、保持“紧”的十一。由于报名了全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff0c;11月4号就要考试&#xff0c;因此…

磁盘空间不够引发的控制录像程序崩溃到后端的解决方式

国庆回来发现我在公司负责写控制录像程序定时或定空间大小截断的Java程序&#xff0c;但是服务器突然奔溃了&#xff0c;导致我的磁盘中.config文件一片空白&#xff0c;查docker日志呗 java.io.IOException: No space left on deviceat java.base/java.io.FileOutputStream.w…

抓包https请求网络异常/无数据怎么破?歪歪老师来帮你!

以“贝壳找房”为例&#xff1a; Fiddler中看到的请求是这样的&#xff1a; 你可能开始找证书的问题&#xff1a;是不是Fiddler/Charles的证书没有导入的手机中去&#xff1f;配置一遍又一遍&#xff0c;又开始对比web端浏览器的https发现没问题。这时候你可能已经开始怀疑人生…

3d 贴图下载quixel

Quixel Megascans https://polyhaven.com/a/studio_small_03 Quixel Bridge&#xff1a;3D艺术家的宝库 在3D建模和渲染的世界中&#xff0c;找到高质量、适合项目的贴图素材至关重要。Quixel Bridge就是这样一个为3D艺术家提供大量免费贴图素材的资源库。在本文中&#xff…

体会jdk17对于空指针的增强

jdk17 // 可以清楚的看出来a.b.c.num中由于c是空指针&#xff0c;所以导致异常 jdk11 // 只报第6行空指针了&#xff0c;但是因为哪个变量&#xff0c;不知道

Configuration of phpstudy and sqli-labs

Go download the app&#xff1a; 小皮面板(phpstudy) - 让天下没有难配的服务器环境&#xff01; (xp.cn) Have done. Then enter the program. Enable both functions&#xff1a; Apache and MySQL. Open the website&#xff1a; Next, Lets make the sqli-liab. GitHub…