Python的解析网页【XPath】

news2024/11/17 1:51:02

XPath

什么是XPath

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

安装配置

安装lxml

pip install lxml

使用lxml:

from lxml import etree

XPath常用规则

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

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

高级用法说明:

  • 选择特定节点类型:

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

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

    • element:匹配元素节点。

    • @attribute:匹配属性节点。

  • 属性选择:

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

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

  • 位置选择:

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

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

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

案例说明:

快速入门

在当前项目下创建一个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)

浏览器XPath工具

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

参考地址:乐百川 - 简书

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

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

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

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

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

requests_html

什么是requests_html

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

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

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

安装与配置

pip install requests-html

快速入门

使用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循环遍历并打印其中的链接。

图片下载

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)

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

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

相关文章

微软Build开发者大会速览,OpenAI CEO站台剧透新模型

5月22日凌晨&#xff0c;微软Build 2024开发者大会在美国西雅图召开。微软CEO萨蒂亚纳德拉在会上发表主题演讲&#xff0c;宣布了超过50项产品更新&#xff0c;涵盖AI基础设施、模型产品以及生产力工具等多个领域。纳德拉强调&#xff0c;微软一直致力于让人工智能理解人类并帮…

AI工具助力:打造完美答辩PPT的秘诀

很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路&#xff0c;一窍不通。但这并不是你们的错&#xff0c;对于平时没接触过相关方面&#xff0c;第一次搞答辩PPT的人来说&#xff0c;这是很正常的一件事。一个好的答辩PPT可以根据以下分为以下几部分来写。 1.研究的背景和…

时间|基于SprinBoot+vue的时间管理系统(源码+数据库+文档)

时间管理系统 目录 基于SprinBootvue的时间管理系统 一、前言 二、系统设计 三、系统功能设计 1管理员功能模块 2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农…

Unity版本使用情况统计(更新至2024年4月)

UWA发布&#xff5c;本期UWA发布的内容是第十四期Unity版本使用统计&#xff0c;统计周期为2023年11月至2024年4月&#xff0c;数据来源于UWA网站&#xff08;www.uwa4d.com&#xff09;性能诊断提测的项目。希望给Unity开发者提供相关的行业趋势作为参考。 2023年11月 - 2024年…

ChatGPT实现法语口语练习APP

使用ChatGPT实现一个法语口语练习APP可以提供一个强大的工具&#xff0c;帮助学习者提高他们的口语能力。以下是一个详细的实现流程&#xff0c;包括需求分析、技术选型、开发、测试和部署。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合…

考研数学|张宇《1000题》正确率达到多少算合格?

张宇1000题是考研数学难度较大一些的题集&#xff0c;题目难&#xff0c;计算量大&#xff0c;第一次做题时&#xff0c;如果正确率能达到60%&#xff0c;那就已经算是不错了。有些题目设计得挺巧妙&#xff0c;有时候第一次见&#xff0c;想不出解题思路也是正常的。 传统习题…

C51单片机开发--库函数

知不足而奋进 望远山而前行 目录 系列文章目录 文章目录 前言 目标 内容 开发过程回顾 使用库函数点灯 什么是库函数? 面向库函数和面向寄存器开发 使用delay模块延时 总结 前言 在嵌入式系统开发中&#xff0c;使用库函数是提高开发效率、简化编程的重要手段之一…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《基于优先指数的配电网分布式储能序次规划》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

我国赤泥年产量庞大 政策引导下赤泥绿色利用率将不断提升

我国赤泥年产量庞大 政策引导下赤泥绿色利用率将不断提升 赤泥是指从铝土矿中提炼氧化铝后产生的强碱性工业固体废渣&#xff0c;由于含大量氧化铁&#xff0c;表面呈现红色&#xff0c;而得名赤泥。   赤泥通常包含氧化铝、氧化铁、二氧化硅、氧化钙、碱金属及其他微量元素&…

【深度 Q 学习-01】 Q学习概念和python实现

文章目录 一、说明二、深度 Q 学习概念三、python实现四、结论 关键词&#xff1a;Deep Q-Networks 一、说明 在强化学习 &#xff08;RL&#xff09; 中&#xff0c;Q 学习是一种基础算法&#xff0c;它通过学习策略来最大化累积奖励&#xff0c;从而帮助智能体导航其环境。它…

SAP实施方法论

SAP新实施方法论 RDS Activate

分布式拒绝服务解决方式

在网络安全领域中&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击始终占据着举足轻重的地位&#xff0c;其影响力不容忽视。随着网络技术的日新月异和网络环境的日益复杂化&#xff0c;DDoS攻击不仅变得愈发频繁&#xff0c;而且其破坏性和影响力也呈现出惊人的增…

二区5分纯生信|单细胞+非负矩阵+AlphaFold+机器学习组合

说在前面 学文不看刊 这篇分析总体来说工作量不算大&#xff0c;scRNA联合bulkRNA分析&#xff0c;多种机器学习组合预测模型&#xff0c;最后用了AlphaFold2预测蛋白及AutoDock分子对接 非常适合小白学习和模仿&#xff0c;其次在筛选出核心基因后可以再加几个外部数据集观…

【最优化方法】实验四 约束最优化方法的MATLAB实现

实验的目的和要求&#xff1a;通过本次实验使学生较为熟练使用MATLAB软件&#xff0c;并能利用该软件进行约束最优化方法的计算。 实验内容&#xff1a; &#xff11;、罚函数法的MATLAB实现 &#xff12;、可行方向法的MATLAB实现 学习建议&#xff1a; 本次实验就是要通…

抠像标签合并到原图,jpg 和 png合并,查看标签是否准确

抠像 原图 和 标签合并&#xff0c;查看抠像是否准确 合并后的图&#xff0c;是带有 羽化 效果的 import osimport cv2 import numpy as npdef apply_mask_with_feathering(original_image_path, mask_image_path):# 读取原图和mask图original_image cv2.imread(original_im…

一分钟教你学浪app视频怎么缓存

你是否在学浪app上苦苦寻找如何缓存视频的方法&#xff1f;你是否想快速、轻松地观看自己喜欢的视频内容&#xff1f;那么&#xff0c;让我们一起探索一分钟教你如何缓存学浪app视频的技巧吧&#xff01; 学浪下载工具我已经打包好了&#xff0c;有需要的自己下载一下 学浪下…

豆瓣内容抓取:使用R、httr和XML库的完整教程

概述 在数据分析和统计领域&#xff0c;R语言以其强大的数据处理能力和丰富的包库资源而闻名。它不仅提供了一个灵活的编程环境&#xff0c;还拥有专门用于数据抓取和处理的工具&#xff0c;如httr和XML库。这些工具使得从各种网站上抓取数据变得简单而高效。 豆瓣网站作为一个…

Excel 单元格式 “万” 和 “亿” 展示

先看结果 实现方法&#xff1a; 将单元格式 格式设置为 [>999999]0!.00,,"亿";[>999]0!.0,"万";0 我这里设置的是大于 999 和 99万 生效对应的万和 亿 如果想要达到1万 和达到 1亿 才生效可以设置为如下 [>1000000000]0!.00,,"亿"…

RUST 和 GO 如何管理它们的内存

100编程书屋_孔夫子旧书网 Go 中的内存管理 Go 中的内存不会在缓存键被驱逐时立即释放。 相反&#xff0c;垃圾收集器会经常运行以发现任何没有引用的内存并释放它。 换句话说&#xff0c;内存会一直挂起&#xff0c;直到垃圾收集器可以评估它是否真正不再使用&#xff0c;而…

AI架构设计6:vLLM

训练大型语言模型以及微调的教程比比皆是&#xff0c;但关于在生产环境中部署它们并监控其活动的资料相对稀缺。上个章节提到了未来云原生的AI是趋势&#xff0c;然而涉及到云原生会比较偏技术。而在此之前为了解决大模型部署量产的问题&#xff0c;社区也一直在探索&#xff0…