Python爬虫——HTML中Xpath定位

news2024/12/26 0:03:47

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的图书信息啦!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vulnhub靶场【hacksudo】之LPE的后续提权方法学习

前言 靶场&#xff1a;hacksudo-lpe的后几个challenge 基于上篇靶场hacksudo-ple的sudo提权 SUID文件提权 ar文件提权 使用find寻找具有SUID权限的文件 find / -perm -us -type f 2>/dev/null查看ar的SUID用法 sudo install -m xs $(which ar) .TF$(mktemp -u) LFILE&…

uniapp -- 实现页面滚动触底加载数据

效果 首选,是在pages.json配置开启下拉刷新 {"path": "pages/my/document/officialDocument","style": {"navigationStyle":</

【Windows11系统局域网共享文件数据】

【Windows11系统局域网共享文件数据】 1. 引言1. 规划网络2. 获取必要的硬件3. 设置网络4. 配置网络设备5. 测试网络连接6. 安全性和维护7. 扩展和优化 2. 准备工作2.1: 启用网络发现和文件共享2.2: 设置共享文件夹 3. 访问共享文件夹4. 小贴士5. 总结 1. 引言 随着家庭和小型办…

学习Ajax (概述,应用场景,使用jQury 实现ajax)

目录 前言 概述 什么是Ajax? 同步交互与异步交互的区别是什么呢&#xff1f; 应用场景 场景1 在搜索框搜索 资源 场景2 登录业务的对用户名处理 AJAX的优缺点 优点&#xff1a; 缺点&#xff1a; 使用jQury 实现ajax 使用步骤 1 引入jQury 文件 2 使用Ajax 函数…

【单片机开发】MCU三种启动方式(Boot选择)[主Flash/系统存储器(BootLoader)/嵌入式SRAM]

目录 参考资料&#xff1a; 利用 Boot 选择不同的启动方式&#xff1a; 单片机的存储结构(主 FLASH/系统存储器/嵌入式 SRAM)&#xff1a; 1. Cortex-M 内核芯片——启动原理&#xff1a; 1.1. 启动流程&#xff1a; 1.2. 根据单片机的存储器映射和架构图&#xff1a;启动…

C语言(指针基础2练习)

利用指针变量将一个数组中的数据反向输出。 #include <stdio.h>void rev(int *arr, int size) {int *end arr size - 1;for (int *ptr end; ptr > arr; ptr--){printf("%-3d", *ptr);}printf("\n"); } void get(int arr[], int len) {for (in…

微信小程序web-view 嵌套h5界面 实现文件预览效果

实现方法&#xff1a;(这里我是在小程序里面单独加了一个页面用来下载预览文件) 安装 使用方法请参考文档 npm 安装 npm install weixin-js-sdk import wx from weixin-js-sdk预览 h5界面代码 <u-button click"onclick" type"primary" :loading"…

C—初阶调试

对你有帮助的话能否一键三连啊&#xff01;祝每个人心想事成&#xff01; 什么是Bug? 首先我们先了解一下日常口语中的“Bug”是什么 Bug可以理解为计算机程序错误&#xff0c;编程时的漏洞 调试及重要性 顾名思义&#xff0c;调试就是通过工具找出bug存在&#xff0c;找出…

vs打开unity项目 新建文件后无法自动补全

问题 第一次双击c#文件自动打开vs编辑器的时候能自动补全&#xff0c;再一次在unity中新建c#文件后双击打开发现vs不能自动补全了。每次都要重新打开vs编辑器才能自动补全&#xff0c;导致效率很低&#xff0c;后面发现是没有安装扩展&#xff0c;注意扩展和工具的区别。 解决…

中间件--MongoDB部署及初始化js脚本(docker部署,docker-entrypoint-initdb.d,数据迁移,自动化部署)

一、概述 MongoDB是一种常见的Nosql数据库&#xff08;非关系型数据库&#xff09;&#xff0c;以文档&#xff08;Document&#xff09;的形式存储数据。是非关系型数据库中最像关系型数据库的一种。本篇主要介绍下部署和数据迁移。 在 MongoDB 官方镜像部署介绍中&#xff…

基于大模型的 AI Agent 技术框架全解析

一、AI Agent 与大语言模型&#xff1a;智能时代的双璧合辉 &#xff08;一&#xff09;AI Agent&#xff1a;智能化浪潮的引领者 在科技迅猛发展的当下&#xff0c;AI Agent 作为一种能够自主感知环境、决策并行动的智能系统&#xff0c;正引领着智能化的新潮流。与传统智能系…

5.ABAP结构体和内表

总学习目录请点击下面连接 SAP ABAP开发从0到入职&#xff0c;冷冬备战-CSDN博客 目录 5.1.结构化数据对象 定义 如何引用结构化的数据对象 拷贝 实战练习 创建 拷贝 调试代码 5.2.内表 行类型 键 表种类 存取类型 表类型 如何在本地定义表类型 内表三种可能的…

3D 生成重建030-SV3D合成环绕视频以生成3D

3D 生成重建030-SV3D合成环绕视频以生成3D 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 论文提出了Stable Video 3D (SV3D)——一个用于生成围绕三维物体的高分辨率图像到多视角视频的潜在视频扩散模型。最近关于三维生成的文献提出了将二维生成模型应用于新视图合成…

中介者模式的理解和实践

一、中介者模式概述 中介者模式&#xff08;Mediator Pattern&#xff09;&#xff0c;也称为调解者模式或调停者模式&#xff0c;是一种行为设计模式。它的核心思想是通过引入一个中介者对象来封装一系列对象之间的交互&#xff0c;使得这些对象不必直接相互作用&#xff0c;从…

【蓝桥杯每日一题】砍竹子

砍竹子 2024-12-7 蓝桥杯每日一题 砍竹子 STL 贪心 题目大意 这天, 小明在砍竹子, 他面前有 nn 棵竹子排成一排, 一开始第 ii 棵竹子的 高度为 h i h_i hi​. 他觉得一棵一棵砍太慢了, 决定使用魔法来砍竹子。魔法可以对连续的一 段相同高度的竹子使用, 假设这一段竹子的高度为…

泷羽sec-burpsuite(5)app渗透测试(上) 学习笔记

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

从一个Bug谈前端响应拦截器的应用

一、问题场景 今天在开发商品管理系统时&#xff0c;遇到了一个有趣的问题&#xff1a;当添加重复的商品编号时&#xff0c;页面同时弹出了两条 "商品编号已存在" 错误提示&#xff1a; 这个问题暴露了前端错误处理机制的混乱&#xff0c;让我们从这个问题出发&…

量子变分算法---损失函数

引子 关于损失函数&#xff0c;我们知道在强化学习中&#xff0c;会有一个函数&#xff0c;用来表示模型每一次行为的分数&#xff0c;通过最大化得分&#xff0c;建立一个正反馈机制&#xff0c;若模型为最优则加分最多&#xff0c;若决策不佳则加很少分或者扣分。而在神经网络…

车间的图纸在传输过程的安全怎么保障?

车间的图纸在传输过程的安全保障&#xff0c;要从很多方面出发分析&#xff0c;本文从以下几点为大家列出几个&#xff0c;看看有没有你想知道的呢~ 1、采用先进的图纸加密软件 采用先进的加密算法对图纸进行加密处理&#xff0c;确保图纸文件在存储、传输和使用过程中的安全性…

MQTT消息服务器mosquitto介绍及说明

Mosquitto是一个开源的消息代理软件&#xff0c;支持MQTT协议&#xff08;消息队列遥测传输协议&#xff09;。MQTT是一种轻量级的发布/订阅消息传输协议&#xff0c;专为低带宽、不可靠网络环境下的物联网设备通信而设计。以下是关于Mosquitto服务器的一些介绍和说明&#xff…