Python爬虫——HTML中Xpath定位

Xpath是一种路径查询语言。利用一个路径表达式从html文档中找到我们需要的数据位置,进而将其写入到本地或者数据库中。

学习Xpath爬虫,我们首先学习一下python中lxml库

关于库

lxml

终端下载Xpath需要用到的模块

pip install lxml

关于HTML

超文本标记语言,是用来描述网页的一种语言。主要用于控制数据的显示和外观。HTML文档一定意义上可以被称为网页。但反过来说网页不仅仅是HTML,网页本质有三部分构成:负责内容结构的HTML,负责表现的CSS,以及负责行为的javascript。本文主要分享的是最核心的内容结构部分。

html结构

完整的HTML文件至少包括标签、标签、标签和标签,并且这些标签都是成对出现的,开头标签为<>,结束标签为</>,在这两个标签之间添加内容。通过这些标签中的相关属性可以设置页面的背景色、背景图像等。

例如,我们打开 汽车之家 首页,摁下键盘上的F12键,打开浏览器自带“开发者工具”,可以看到一个完整的html文档结构,如下图

在这里插入图片描述

打开 中图网 首页,摁下键盘上的F12键,打开浏览器自带“开发者工具”,可以看到一个完整的html文档结构,如下图

在这里插入图片描述

从上图可以看出,一个完整的html文档主要包含三部分:DTD文档头,head头部信息和body正文信息。其中DTD文档头用来告诉浏览器执行标准是什么(比如html4或是html5),head头部信息用来说明浏览器的编码方式和文档头名称,body顾名思义就是浏览器的正文部分。

html标签

作为开始和结束的标记,由尖括号包围的关键词,比如 ,标签对中的第一个标签是开始标签,第二个标签是结束标签。html中常见标签如下:

在这里插入图片描述

其中, “< ul >< li >”是一种嵌套顺序,无序列表,成对出现;

li的父元素必须是ul或者ol,不同之处在于ol是一种有序列列表,而ul是无序列表;

html属性

属性是用来修饰标签的,放在开始标签里里面,html中常见四大属性:

属性说明
class规定元素的类名,大多数时候用于指定样式表中的类
id唯一标识一个元素的属性,在html里面必须是唯一的
href指定超链接目标的url
src指定图像的url

Xpath

xpath常见使用方法
符号功能
//表示在整个文本中查找,是一种相对路径
/表示则表示从根节点开始查找,是一种绝对路径
text()找出文本值
@找出标签对应的属性值,比如@href就是找出对应的href链接
.表示当前节点
表示当前节点的父节点

举个例子,定位中图网中图书畅销榜TOP1000书本的位置。

2024年畅销图书排行榜_图书销量排行榜_中图网

定位TOP1图书

在这里插入图片描述

在开发者工具这一侧按住ctrl+F,在浮出的搜索栏里依次输入我们找到top1图书的位置
在这里插入图片描述

/html/body/div[@class=‘content’]/div/div[@class=‘container’]/div/div[@class=‘listLeft’]/div[@class=‘bookList’]/ul/li

这是绝对路径,也就是完整路径。

我们也可以通过相对路径//定位到第一本书

//div[@class=‘listMainclearfix’]/div[2]/div[2]/ul/li

特别注意:通过相对路径找到的路径,用//开始 ,且//后面的标签是唯一的。可以在ctrl+F浮出的搜索栏里查询该标识符是否出现且唯一

在这里插入图片描述

这样我们就在HTML里顺利的找到TOP1的位置啦!

当然 Xpath除了上述常见用法外,还存在两种比较特殊的用法:

  • 以相同的字符开头

用法1:以相同的字符开头:starts-with(@属性部分,属性字符相同部分

#例子1:
from lxml import etree
html1 = """
<!DOCTYPE html>
<html>
 <head lang='en'>
    <meta charest='utf-8'>
    <title></title>
 </head>
 <body>
    <div id="aaa">哇哈哈</div>
    <div id="bbb">爽歪歪</div>
    <div id="ccc">营养快线</div>
 </body>
</html>
"""

# 将符合html格式的字符串转成可以编写xpath语法的格式
info1 = etree.HTML(html1)

res1 = info1.xpath('//div[1]/text()')
print(res1, type(res1))
print('------------------')
res2 = info1.xpath('//div[2]/text()')
print(res2, type(res2))
print('------------------')
res3 = info1.xpath('//div[3]/text()')
print(res3, type(res3))

在这里插入图片描述

  • 标签套标签

用法2:标签套标签:string(.)

#例子2:
from lxml import etree
html2 = """
<!DOCTYPE html>
<html>
 <head lang='en'>
    <meta charest='utf-8'>
    <title></title>
 </head>
 <body>
    <div id="test3">
    我左青龙,
        <span id='tiger'>
            右白虎
            <ul>上朱雀,
                <li>下玄武,</li>
            </ul>
        </span>
        龙头在胸口
    </div>
 </body>
</html>
"""
info2 = etree.HTML(html2)
res1 = str(info2.xpath('string(.)'))
res1 = res1.replace("\n","").replace(" ","").replace("\t","")
print(res1)

在这里插入图片描述

xpath的谓语结构

所谓"谓语条件",就是对路径表达式的附加条件。所有的条件,都写在方括号"[]"中,表示对节点进行进一步的筛选。例如:

<?xml version="1.0" encoding="ISO-8859-1"?>
<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>
     <book>
    <title lang="eng">Harry Potter</title>
    <price>29.99</price>
  </book>
  <book>
    <title lang="eng">Learning XML</title>
    <price>39.95</price>
  </book>
     <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>

下面从几个简单的例子让大家体会一下

  • /bookstore/book[1] :表示选择bookstore的第一个book子元素。
  • /bookstore/book[last()] :表示选择bookstore的最后一个book子元素。
  • /bookstore/book[last()-1] :表示选择bookstore的倒数第二个book子元素。
  • /bookstore/book[position()< 3] :表示选择bookstore的前两个book子元素。
  • //title[@lang] :表示选择所有具有lang属性的title节点。
  • //title[@lang=‘eng’] :表示选择所有lang属性的值等于"eng"的title节点。
函数说明举例
contains选取属性或者文本包含某些字符//div[contains(@id, ‘data’)] 选取 id 属性包含 data 的 div 元素 //div[contains(string(), ‘支付宝’)] 选取内部文本包含“支付宝”的 div 元素
starts-with选取属性或者文本以某些字符开头//div[starts-with(@id, ‘data’)] 选取 id 属性以 data 开头的 div 元素 //div[starts-with(string(), ‘银联’)] 选取内部文本以“银联”开头的 div 元素
ends-with选取属性或者文本以某些字符开头//div[ends-with(@id, ‘require’)] 选取 id 属性以 require 结尾的 div 元素 //div[ends-with(string(), ‘支付’)] 选取内部文本以“支付”结尾的 div 元素

学习了Xpath定位后,我们下一篇将用Xpath方法爬取中图网TOP1000的图书信息啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/933772.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud Alibaba 之 “Sentinel”

从网上下载好sentinel-dashboard-1.6.3.jar&#xff0c;然后执行 java -jar sentinel-dashboard-1.6.3.jar,执行成功之后在浏览器输入localhost:8080&#xff0c;Sentinel的登录名和密码都是sentinel,登陆成功之后看到只有一个首页。 接下来开始整合Spring Cloud Alibaba Sen…

伟测科技再融资11.75亿:增收不增利,毛利率近年来持续下滑

《港湾商业观察》施子夫 王璐 12月9日&#xff0c;上海证券交易所上市审核委员会召开2024年第34次上市审核委员会审议会议&#xff0c;审议上海伟测半导体科技股份有限公司(再融资)&#xff08;以下简称&#xff0c;伟测科技&#xff1b;688372.SH&#xff09;事项。 今年8月…

Postman cURL命令导入导出

你是否曾为在Postman和终端之间切换、整理请求而抓狂&#xff1f;其实&#xff0c;Postman支持与cURL命令的无缝互通&#xff0c;通过导入导出&#xff0c;极大提升效率。用好这个功能&#xff0c;分分钟让接口测试更高效&#xff01; Postman如何快速导入cURL命令&#xff1f;…

MR30分布式 I/O 模块助力 CNC 设备产能飞跃

背景分析 在现代制造业中&#xff0c;CNC 设备扮演着极为关键的角色。然而&#xff0c;CNC 设备在运行过程中也存在着诸多痛点。传统的 CNC 设备往往在控制与通信方面存在局限&#xff0c;其内部的 I/O 系统大多采用集中式架构。这种架构下&#xff0c;一旦需要处理大量的输入输…

《ODIN: A Single Model for 2D and 3D Segmentation》CVPR2024

斯坦福和微软&#xff1a; 代码链接&#xff1a;ODIN: A Single Model For 2D and 3D Perception 论文链接&#xff1a;2401.02416 摘要 这篇论文介绍了ODIN&#xff08;Omni-Dimensional INstance segmentation&#xff09;&#xff0c;一个能够同时处理2D RGB图像和3D点云…

从视觉到雷达:多模态感知如何引领自动驾驶安全革命

文章目录 摘要引言多模态感知融合的原理与架构感知技术的特点多模态感知融合的目标 数据融合实现示例代码结构与主要组件模型定义 MultimodalFusionModel前向传播&#xff08;forward 方法&#xff09;模型细节剖析实践应用 QA环节总结参考资料 摘要 本文探讨了多模态感知技术…

uniapp结合movable-area与movable-view实现拖拽功能

前言 因为公司业务开发需要拖拽功能。 ps&#xff1a;该功能只能针对高度一致的&#xff0c;如果高度不一致需要另外二开 演示 开始 <template><view style"height: 100%;"><movable-area :style"{width: 100%, height: allHeight px}"…

ElasticSearch如何做性能优化?

大家好&#xff0c;我是锋哥。今天分享关于【ElasticSearch如何做性能优化&#xff1f;】面试题。希望对大家有帮助&#xff1b; ElasticSearch如何做性能优化&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中&#xff0c;性能优化是…

AI开发: 知识图谱的初识,学会制作知识图谱- Python 机器学习

一、知识图谱的概念 知识图谱是一个通过图结构来表示和组织知识的工具&#xff0c;它将事物、概念和它们之间的关系以图的形式呈现出来&#xff0c;图中的节点代表实体&#xff08;比如人物、地点、事件等&#xff09;&#xff0c;而边代表这些实体之间的各种关系&#xff08;…

软考高级难度排名,哪个科目容易过?

软考高级五个科目&#xff0c;哪个比较好考&#xff1f;今天就来和大家聊一聊~ 一、软考高级科目设置 高级科目包含&#xff1a;信息系统项目管理师、系统分析师、系统架构设计师、网络规划师以及系统规划与管理师5个科目。 1. 信息系统项目管理师 信息系统项目管理师&#…

浅谈网络 | 应用层之云网络隔离GRE/VXLAN

目录 前言GRE 隧道技术VXLANGRE/VXLAN接入云平台 前言 之前提到&#xff0c;为云平台中的租户实现隔离时&#xff0c;常用的策略是基于 VLAN。然而&#xff0c;VLAN 只有 12 位&#xff0c;共支持 4096 个 ID&#xff0c;这在最初设计时看似足够&#xff0c;但随着云计算的快速…

上海交通大学《2024年816自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《上海交通大学816自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题

零基础入门 Pyecharts 实用教程:从基础绘图到进阶技巧

简介&#xff1a;本文面向 Python 数据可视化初学者&#xff0c;脚踏实地分享 Pyecharts 库的使用经验。从查看 Pyecharts 版本起步&#xff0c;详细拆解绘制首个图表的全过程&#xff0c;涵盖导入模块、设置坐标轴、渲染 HTML 文件等基础操作&#xff1b;点明链式调用的版本要…

STM32 通过读取看门狗溢出标志检测程序是否发生复位

通过 __HAL_RCC_GET_FLAG 函数&#xff0c;读取看门狗溢出标志检测程序是否发生复位&#xff0c; 目录 一、__HAL_RCC_GET_FLAG 函数二、Stm32CubeMx配置三、代码编写四、运行效果 一、__HAL_RCC_GET_FLAG 函数 HAL库的 __HAL_RCC_GET_FLAG 函数可以获取到程序是否发生过看门狗…

记一次由docker容器使得服务器cpu占满密码和密钥无法访问bug

Bug场景&#xff1a; 前几天在服务器上部署了一个免费影视网站&#xff0c;这个应用需要四个容器&#xff0c;同时之前的建站软件workpress也是使用docker部署的&#xff0c;也使用了三个容器。在使用workpress之前&#xff0c;我将影视软件的容器全部停止。 再使用workpress…

Linx下自动化之路:Redis安装包一键安装脚本实现无网极速部署并注册成服务

目录 简介 安装包下载 安装脚本 服务常用命令 简介 通过一键安装脚本实现 Redis 安装包的无网极速部署&#xff0c;并将其成功注册为系统服务&#xff0c;开机自启。 安装包下载 redis-7.0.8.tar.gzhttp://download.redis.io/releases/redis-7.0.8.tar.gz 安装脚本 修…

开发 UEFI 驱动

服务型驱动的特点&#xff1a; 1&#xff09;在 Image 的入口函数中执行安装&#xff1b; 2&#xff09;服务型驱动不需要驱动特定硬件&#xff0c;可以安装到任意控制器上&#xff1b; 3&#xff09;没有提供卸载函数。 一个设备 / 总线驱动程序在安装时首先要找到对应的硬件…

实现 DataGridView 下拉列表功能(C# WinForms)

本文介绍如何在 WinForms 中使用 DataGridViewComboBoxColumn 实现下拉列表功能&#xff0c;并通过事件响应来处理用户的选择。以下是实现步骤和示例代码。 1. 效果展示 该程序的主要功能是展示如何在 DataGridView 中插入下拉列表&#xff0c;并在选择某一项时触发事件。 2.…

传输层5——TCP可靠传输的实现(重点!!)

TCP协议如何实现可靠传输&#xff1f;确保接收方收到数据&#xff1f; 需要依靠几个结构&#xff1a; 以字节为单位的滑动窗口 这其中包括发送方的发送窗口和接收方的接收窗口 下面的描述&#xff0c;我们指定A为发送端口&#xff0c;B为接收端口 TCP的可靠传输就是靠着滑动窗口…

java Random随机数

Randoms是什么 在Java中&#xff0c;Random类是用于生成伪随机数的工具。它位于java.util包中。以下是一些使用Random类生成不同类型的随机数的方法&#xff1a; 1 创建 Random 类的实例 2 生成一个随机的int值&#xff08;范围从Integer.MIN_VALUE到Integer.MAX_VALUE&#…