python-15(Xpath)

1.XPath

1.1.什么是XPath

XPathXML Path Language)是一种用于在XML文档中定位和选择节点的语言。它是W3CWorld Wide Web Consortium)定义的一种标准查询语言,广泛用于解析和操作XML文档,也可以操作html文档

XML和HTML区别:

XML:可拓展标记语言

HTML:超文本标记语言

1.2.安装配置

安装lxml

pip install lxml

使用lxml:

from lxml import etree

1.3.XPath常用规则

特点:只有一个根节点

XPath使用路径表达式来描述节点的位置和关系。以下是XPath的一些常用规则:

语法说明
nodeName选取此节点的所有子节点
/从当前节点选择直接子节点
//从当前节点选择子孙节点
.当前节点
..选取当前节点的父节点
@获取属性

高级用法说明:

  • 选择特定节点类型:

    • node():匹配任何节点。

    • text():匹配文本节点。

    • element:匹配元素节点。

    • @attribute:匹配属性节点。

  • 属性选择:

    • [@属性名]:匹配具有特定属性的节点。

    • [@属性名=值]:匹配属性值等于给定值的节点。

  • 位置选择:

    • [位置]:选择在指定位置的节点。

    • [last()]:选择最后一个节点。

    • [position()<n]:选择前 n 个位置的节点。

案例说明:

1.4.快速入门

在当前项目下创建一个index.html,如下:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
      <div class="aa">hello world</div>
      <div class="bb">hello python</div>
    </body>
</html>

完整代码示例如下:

p = pathlib.Path("index.html")
# 网页初始化
html = etree.HTML(p.read_text(encoding="utf-8"))  # type: lxml.etree._Element
# 打印类型
# print(type(html))
# 获取指定节点
# print(html.xpath("body"))
# 获取当前节点
# print(html.xpath("."))
# 获取当前节点下的直接子节点
# print(html.xpath("./body"))
# 获取当前节点下的子孙节点
# print(html.xpath("//div"))
# 获取当前节点的父节点
# div = html.xpath("./body/div")[0]  #type: lxml.etree._Element
# print(div.xpath(".."))
# 根据属性获取
# print(html.xpath("//div[@class='aa']"))
# 获取属性的值
# print(html.xpath("//div/@class"))
# 注意:元素顺序下标从1开始
# print(html.xpath("//div[1]/@class"))
# 获取文本信息
# print(html.xpath("//div[1]/text()"))
# print(html.xpath("//div[1]")[0].text)

1.5.浏览器XPath工具

打开Chrome浏览器,按F12打开开发者工具,找到console输入XPath语法指令查找网页内容。

参考地址:乐百川 - 简书

示例要求:通过浏览器的XPath工具搜索上述网页中的文章标题信息。

  • 方式一:直接通过@class获取

$x("//div[@class='content  ']/a/text()")

  • 方式二:通过contains函数方式匹配@class属性的值

$x("//div[contains(@class,'content')]/a/text()")

2.requests_html

2.1.什么是requests_html

requests_html是一个Python库,用于从Web页面中提取数据。它提供了对HTML内容的解析和处理功能,使您可以轻松地从网页中提取文本、链接、图像和其他元素。

requests_html库建立在另一个流行的Python库requests之上,并使用了lxml来解析HTML。它提供了一种简单而灵活的方法来发送HTTP请求并解析响应中的HTML内容。

使用requests_html,可以发送GET或POST请求,从HTML响应中提取元素,执行JavaScript渲染,处理表单提交,模拟用户与网页的交互等等。它还支持基于CSS选择器和XPath表达式的元素选择,方便地定位和提取特定的网页元素。

2.2.安装与配置

pip install requests-html

2.3.快速入门

使用requests_html模块获取页面中的所有绝对链接的示例代码:

# 创建一个会话
session = requests_html.HTMLSession()
# 起送GET请求并获取页面内容
resp = session.get("https://www.igdcc.com/shouji/katong/") # type: requests_html.HTMLResponse
# 渲染JavaScript
resp.html.render()
​
# 获取页面中所有的绝对链接
lst = list(resp.html.absolute_links)
print(lst)

因为是第一次使用render函数,需要安装chromium,这里需要花费一定的时间,请耐心等待。

在上述示例中,response.html.absolute_links会返回一个包含页面中所有绝对链接的集合(Set)。可以使用for循环遍历并打印其中的链接。

2.4.图片下载

urllib.request.urlretrieve函数是Python标准库中urllib.request模块提供的一个方法,用于从指定的URL下载文件并保存到本地。

下面是urllib.request.urlretrieve()函数的完整参数说明:

  • url:必需,要下载的文件的URL地址。

  • filename:必需,保存文件的本地路径和文件名。如果未指定此参数,则会将文件保存到临时目录中,返回保存的临时文件名。

  • reporthook:可选,一个回调函数,用于显示下载进度。可以是一个自定义的回调函数,格式为 reporthook(count, blockSize, totalSize),其中count表示已经下载的数据块数量,blockSize表示每个数据块的大小,totalSize表示要下载的文件的总大小。默认情况下,不会显示下载进度。

  • data:可选,要发送的额外数据。可以是一个字节流(str或bytes类型)或者一个文件对象。如果指定了此参数,urlretrieve()函数会使用POST请求发送数据。

  • headers:可选,一个字典类型,表示发送请求时的头部信息。

  • origin_req_host:可选,字符串类型,表示原始请求的主机名。用于在重定向时设置 Referer 头部。默认情况下,origin_req_hostNone

  • unverifiable:可选,布尔值,表示请求是否可验证。如果设置为True,则会跳过某些HTTPS验证步骤。默认值为False

注意:urllib.request.urlretrieve()函数的执行会阻塞当前线程,直到下载完成。

入门案例:

参考地址:卡通4K手机壁纸_高清卡通手机桌面图片_极品桌面

可先通过浏览器的XPath工具方式定位元素具体地址,如下:

基本代码:

# 通过xpath获取页面中满足条件的图片
urls = resp.html.xpath("""//a/img/@data-original""")
for url in urls:
    print(f"正在下载【"+url+"】,请稍等...")
    urllib.request.urlretrieve(url,f"images/{uuid.uuid4()}.jpg")

调用urllib.request.urlretrieve()函数时,可以通过提供一个回调函数来显示下载进度。如下所示:

def show(count, blockSize, totalSize):
    """
    回调函数用于显示下载进度
    :param count: 已经下载的数据块数量
    :param blockSize: 每个数据块的大小
    :param totalSize: 要下载的文件的总大小
    :return:
    """
    percent = round((count * blockSize / totalSize),1) * 100
    print(f"正在下载: {percent}%")
    time.sleep(0.1)
    
# 通过xpath获取页面中满足条件的图片
urls = resp.html.xpath("""//a/img/@data-original""")
for url in urls:
    print(f"正在下载【"+url+"】,请稍等...")
    urllib.request.urlretrieve(url,f"images/{uuid.uuid4()}.jpg",show)

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

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

相关文章

TensorBoard在pytorch训练过程中如何使用,及数据读取问题解决方法

TensorBoard 模块导入日志记录文件的创建训练中如何写入数据如何提取保存的数据调用TensorBoard面板可能会遇到的问题 模块导入 首先从torch中导入tensorboard的SummaryWriter日志记录模块 from torch.utils.tensorboard import SummaryWriter然后导入要用到的os库&#xff0…

STAT313 Chap5 多变量核密度估计带宽选择(下)

本文原创笔记&#xff0c;禁止转载。有问题可私信付费找我咨询。 直接插入法的基本步骤 步骤1&#xff1a;计算初始估计&#xff08;Pilot Estimate&#xff09; 选择一个初始的带宽矩阵 G \mathbf{G} G 和核函数 L L L 。计算初始密度估计&#xff1a; f ~ ( x , G ) 1 …

机器人舵机:关键要素解析与选择指南

在机器人技术日新月异的今天&#xff0c;舵机作为机器人的核心部件之一&#xff0c;扮演着至关重要的角色。它的性能直接关系到机器人的运动控制、稳定性以及精度等方面。那么&#xff0c;在选择和使用机器人舵机时&#xff0c;我们需要关注哪些关键要素呢&#xff1f;本文将为…

锐捷校园网自助服务系统 login_judge.jsf 任意文件读取漏洞复现(XVE-2024-2116)

0x01 产品简介 锐捷校园网自助服务系统是锐捷网络推出的一款面向学校和校园网络管理的解决方案。该系统旨在提供便捷的网络自助服务,使学生、教职员工和网络管理员能够更好地管理和利用校园网络资源。 0x02 漏洞概述 校园网自助服务系统/selfservice/selfservice/module/sc…

Nat Commun|直捣黄龙!空间单细胞组学发现外周血靶细胞亚群的组织落脚点

溃疡性结肠炎&#xff08;Ulcerative colitis&#xff0c;UC&#xff09;是一种慢性炎症性肠道疾病&#xff0c;其特征是免疫介导的黏膜炎症和上皮损伤。目前UC的治疗策略已经从单纯的症状缓解转变为更精准的靶向治疗。Vedolizumab&#xff08;VDZ&#xff09;作为一种抗整合素…

微信原生小程序开发,引入vant-weapp报错,构建npm报错

引入组件报错&#xff0c;构建npm也报错 message: NPM packages not found. Please confirm npm packages which need to build are… 解决方法&#xff1a;把 miniprogram 文件夹里的东西全部拿出来&#xff0c;文件夹目录变成下图所示&#xff0c;再把project.config.json …

FundationPose4090

https://github.com/NVlabs/FoundationPose.git 1.下载数据 参照官方指导下载。权重&#xff0c;测试数据 2.修改代码将c14改为c17 3.获取docker docker pull shingarey/foundationpose_custom_cuda121:latest 然后进入docker&#xff0c;再执行 bash build_all.sh 4.可能…

【探索全球精彩瞬间,尽享海外短剧魅力!海外短剧系统,您的专属观影平台】

&#x1f31f; 海外短剧系统&#xff0c;带您走进一个全新的视界&#xff0c;让您随时随地欣赏到来自世界各地的精选短剧。在这里&#xff0c;您可以感受到不同文化的碰撞&#xff0c;品味到各种题材的精髓&#xff0c;让您的生活更加丰富多彩&#xff01; &#x1f3ac; 精选…

推荐系统三十六式学习笔记:原理篇.内容推荐06|超越标签的内容推荐系统

目录 为什么要做好内容推荐&#xff1f;内容源内容分析和用户分析内容推荐算法总结&#xff1a; 基于内容的推荐系统&#xff0c;有个误区&#xff0c;衡量其性能优劣&#xff0c;评判标准是标签数量够不够。其实标签只是很小一部分。而且即便是标签&#xff0c;衡量质量的方式…

解析Pinterest公司的系统架构设计

最近我偶然发现了一个优秀的 YouTube 视频,“Pinterest 是如何在只有 6 名工程师的情况下扩展到 1100 万用户”&#xff08;https://www.youtube.com/watch?sicoeqLRKu5i1nnpbI&vQRlP6BI1PFA&featureyoutu.be&#xff09;以及以下参考文章,“Pinterest 的扩展之路 ——…

Foxmail邮箱的简单实用

Foxmail邮箱是我们办公邮箱中比较有代表性和使用性的一款邮箱软件&#xff0c;今天笔者为大家介绍一下Foxmail邮箱的功能和使用方法。 1、首先我们从安装Foxmail邮箱开始 2、点击安装等待安装成功 3、双击打开 &#xff0c;出现邮箱设置界面输入我们的账号密码&#xff0c;点击…

wpf工程中加入Hardcodet.NotifyIcon.Wpf生成托盘

1、在项目中用nuget引入Hardcodet.NotifyIcon.Wpf。如下图所示。 2、在App.xaml中创建托盘界面&#xff0c;代码是写在 App.xaml 里面 注意在application中一定要加入这一行代码&#xff1a; xmlns:tb"http://www.hardcodet.net/taskbar" 然后在<Application.R…

关于三极管的理解

三极管工作时出现三个状态&#xff1a;截止、放大、饱和 1. 截止状态&#xff1a;三极管处于关断状态&#xff0c;Vce约等于电源电压 2. 放大状态&#xff1a;三极管处于电流放大状态&#xff0c;0V 3. 饱和状态&#xff1a;三极管处于完全导通状态&#xff0c;Vce≈0V 放大电…

【深度学习入门篇一】阿里云服务器(不需要配环境直接上手跟学代码)

前言 博主刚刚开始学深度学习&#xff0c;配环境配的心力交瘁&#xff0c;一塌糊涂&#xff0c;不想配环境的刚入门的同伴们可以直接选择阿里云服务器 阿里云天池实验室&#xff0c;在入门阶段跑个小项目完全没有问题&#xff0c;不要自己傻傻的在那配环境配了半天还不匹配&a…

汇总!7种大模型的部署方法!

我们如何在本地部署运行私有的开源大型语言模型&#xff08;LLMs&#xff09;呢&#xff1f;本文将向您梳理七种实用的方法及如何选择。 Hugging Face的Transformers 这是一个强大的Python库&#xff0c;专为简化本地运行LLM而设计。其优势在于自动模型下载、提供丰富的代码片段…

【学习笔记】Vue3(Ⅱ)

Vue3(Ⅱ) 3、 进阶 —— 路由 3.1、示例 3.2、to 的两种写法 3.3、命令路由 3.4、嵌套路由 3.5、query 参数 3.6、params 参数 3.7、路由的 props 配置 3.8、replace 属性 3.9、编程式导航 3.10、重定向4、 进阶 —— Pin…

Mac系统使用COLMAP

安装教程 如有出入&#xff0c;参照官网手册最新版 Installation — COLMAP 3.9-dev documentation 首先确保mac上安装了Homebrew 1.安装依赖项 brew install \cmake \ninja \boost \eigen \flann \freeimage \metis \glog \googletest \ceres-solver \qt5 \glew \cgal \s…

AI论文:一键生成论文的高效工具

说到这个问题&#xff0c;那真的得看你对“靠谱”的定义是怎样的啦&#xff1f; 众所周知&#xff0c;写论文是一项极其耗时间的事情&#xff0c;从开始的选题到文献资料搜索查阅&#xff0c;大纲整理等等一大堆的繁杂工作是极艰辛的。用AI写论文就不一样了&#xff0c;自动化…

加密算法详解

对称加密 加密方和解密方都使用了相同的密钥,只要保证密钥不会泄露给第三方, 整个通信过程就是安全的。 ​ (对称加密算法流程) 因为对称加密算法整个过程共享同一个密钥,所以使用特点也比较明显。 优点:算法简单,加密速度快;</

白酒:茅台镇白酒的醇厚口感与细腻层次

茅台镇&#xff0c;中国白酒的璀璨明珠&#xff0c;以其与众不同的自然环境和杰出的酿造技艺&#xff0c;孕育出了无数上好白酒。云仓酒庄豪迈白酒作为茅台镇的杰出品牌&#xff0c;以其醇厚口感和细腻层次&#xff0c;赢得了无数消费者的喜爱。 茅台镇地处赤水河畔&#xff0c…