网页解析--接上篇--bs4/xpath

news2025/1/11 17:47:07

网页解析完成的是从下载回来的html文件中提取所需数据的方法,一般会用到的方法有:

正则表达式:将整个网页文档当成一个字符串用模糊匹配的方式来提取出有价值的数据

Beautidul Soup:一个强大的第三方插件

lxml:解析html网页或者xml网页

不同解析办法只是匹配的方式不同,按道理来说几种方法可以相互替换,正则表达式的语法就不做赘述,这里介绍一下Python中的一个库Beautidul Soup,它能将HTML的标签文件解析成树形结构,然后方便地获取到指定标签的对应属性。

Beautiful Soup

官方中文文档 搜索过程:

根据结构化解析的方式将对html的节点按照节点的名称/属性/文字进行搜索:

Beautiful使用方法为:

首先根据html网页和解析编码方式创建一个bs对象

调用find_all或者find方法对节点进行搜索,或者使用find()返回第一个匹配结果

对于搜索到的结果 find all(name,attrs,string)其中name参数表示节点的标签名称,attr为节点的属性名称,string为节点的文字内容。

from bs4 import BeautifulSoup
#根据HTML网页字符串创建BeautifulSoupi对象
soup=BeautifulSoup(
html doc,#HTML文档字符串
'html.parser' #HTML解析器
from_encoding='utf8'#HTML文档的编码
)
#搜索节点

#方法:
#查找所有标签为a的节点
soup.find_al1('a')
#查找所有标签为a,链接符合/view/123.htm形式的节点
soup.find_al1('a',href=‘/view/123.htm')
soup.find_all('a',href=re.compile(r'/view/\d+\.htm2))
#查找所有标签为div,class为abc,文字为Python的节点。class后加'_'是因为python的保留字
soup.find_all('div',class_='abc',string='Python')

find_all方法会返回所有满足要求的节点的列表(tag对象组成的列表),至于节点内容的提取则需要借助get方法(提取属性)或者ger_text()方法(提取文本段落)。具体使用方法可以见之前的一次爬虫实战——爬取壁纸

由于 Beautiful Soup 的解析是基于正则表达式的(’html.parser’),用在缺乏正确标签结构的破损网页上很有效。但是如果想要遍历更加复杂的页面,或者想要抓取器运行得更快并且快速地浏览页面,有很多更加高级的 Python 库可用。让我们看一下许多天才网页抓取器开发者最爱的库: lxml。

CSS

CSS解析方法可以借助bs4中的BeautifulSoup('lxml').select()方法实现,该方法会执行一个css选择

find 利用 DOM 来遍历元素,并基于祖先和家族关系找到它们,而 cssselect 方法利用 CSS 选择器来寻找页面中所有可能的匹配,或者元素的后继,非常类似于 jQuery。

Xpath

菜鸟教程XPath 语法 | 菜鸟教程

https://www.cnblogs.com/hushaojun/p/16124814.html

Xpath是一种基于xml文档的解析方式。

XPath 可以用于几乎所有主要的网页抓取库,并且比其他大多数识别和同页面内容交互的方法都快得多。事实上,大多数同页面交互的选择器方法都在库内部转化为 XPath。

XPath是一种用于选取XML或HTML文档中某部分的表达式语言,通过在文档树中进行导航,可以定位到元素和元素集。在Python中,我们可以使用`lxml`库来解析XML或HTML文档并使用XPath表达式来查找特定元素。下面介绍一下如何使用XPath解析HTML或XML文档:

Xpath使用方法

1. 安装和导入`lxml`库;

2. 获取HTML或XML文档,可以通过`urllib`、`requests`等库从互联网上获取,也可以通过本地文件打开;

3. 使用`lxml`将文档转换为XPath对象,使用`parse()`方法即可;

4. 用XPath语法指南文档树的对应节点进行选择,并获取其中的内容。

以下是一个示例代码,演示了如何使用`lxml`库和XPath表达式解析HTML文档中的数据:


from lxml import etree
import requests

# 发送 HTTP 请求,请求目标页面
response = requests.get("http://www.example.com")

# 解析 HTML 内容
doc = etree.HTML(response.text)

# 使用 XPath 找到所有链接并输出其 URL 和文本内容
links = doc.xpath('//a')
for link in links:
    print(link.get('href'), link.text)

在这个示例程序中,首先发送HTTP请求获取目标页面的HTML内容。然后,利用`etree.HTML`将HTML内容转换为XPath对象`doc`,接着使用XPath表达式`//a`查找所有的链接,最后遍历每一个链接,输出它的URL和文本内容。

xpath语法

XPath语法是一种用于定位XML或HTML文档节点的表达式语言,包含了众多的可用函数和操作符,常用的语法如下:

  • /:选择根节点;
  • //:选择子孙节点,无论它们在文档中的位置;
  • .:选择当前节点;
  • ..:选择当前节点的父节点;
  • @:选择属性节点;
  • []:条件筛选,可以用于过滤选定的节点;
  • |:取并集;
  • *:通配符,匹配任意元素节点;
  • text():匹配文本节点。

还有更多语法规则,以下是一些实例:

还有更多语法规则,以下是一些实例:

  1. 选取所有节点:
  /         # 选择根节点//# 选择所有节点
  1. 选取特定名称的节点:
//tagName # 选择指定名称的节点
  1. 选取某个节点的子节点:
/bookstore/book/title # 选择 bookstore 节点的子节点 book 中的 title 节点
  1. 选取某个节点的父节点:
/bookstore/book/title/../.. # 选择 bookstore 节点的父节点
  1. 选取某个节点的属性:
//tagName[@attributeName='attributeValue']
    //a[@href='/about']
  1. 过滤选定的节点:
//tag[@attributeName='attributeValue']       # 筛选出 tagName 节点,其 attributeName 属性的值等于 attributeValue//tag[contains(@attributeName, 'substring')] # 筛选出 tagName 节点,其 attributeName 属性包含 substring 子字符串
  1. 文本内容筛选:
//p[text()='paragraph text']              # 筛选出文本内容等于 paragraph text 的 p 节点
//p[starts-with(text(), 'substring')]     # 筛选出文本内容以 substring 开头的 p 节点

在XPath语法中,还可以使用常规数学运算符和逻辑运算符,例如+-*<<=>等。使用这些运算符可以进行更复杂的条件筛选,以选择更特定的节点。

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

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

相关文章

一文详解 PoseiSwap,Nautilus Chain 上的首个 DEX

前不久&#xff0c;首个 Layer3 概念的新链 Nautilus Chain 推出了测试网“Triton” 引发瞩目&#xff0c;据了解过&#xff0c;经过一个月的Triton I测试历程&#xff0c;Nautilus Chain社区成员突破200,000&#xff0c;同时测试网激励活动注册地址数突破180,000&#xff0c;链…

Kotlin中lateinit 和 Lazy 的区别

Kotlin中Lateinit 和 Lazy 的区别 latinit 我们可能不想在定义它们时初始化我们的值&#xff0c;相反我们可能想在以后的任何时间初始化并在我们的应用程序中使用它们。但是在使用我们的值之前&#xff0c;一定要记住&#xff0c;我们的值必须先初始化&#xff0c;然后才能使用…

高斯混合模型 GMM 的详细解释

高斯混合模型&#xff08;后面本文中将使用他的缩写 GMM&#xff09;听起来很复杂&#xff0c;其实他的工作原理和 KMeans 非常相似&#xff0c;你甚至可以认为它是 KMeans 的概率版本。 这种概率特征使 GMM 可以应用于 KMeans 无法解决的许多复杂问题。 因为KMeans的限制很多…

【factoryio】虚拟仓储实现(入仓出仓)

实现虚拟工厂场景之一的智能仓储实验 注&#xff1a;本文仅供参考 目录 引 入仓部分 1.上料部分 1.效果 2.实现 2.入仓部分 1.效果 2.实现 3.入仓扩展 1.行列控制和优先级 2.入仓优化和完善 出仓部分 1.出仓 2.后传送带 3.出仓效果 1.效果 2.优先级 3.完…

Linux时间服务器(ntp)

1.配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 2.配置ssh免密登陆&#xff0c;能够通过客户端主机通过redhat用户和服务端主机基于公钥验证方式进行远程连接 一.配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 1、软件安装 [rootl…

高速前行的低代码,其能力边界到底在哪?

最近半年&#xff0c;有好些来自不同岗位、不同立场的人开始问同一个问题&#xff1a;低代码平台的边界是什么&#xff1f;低代码无所不能吗&#xff1f; “全民开发”、“人人都是开发者”这样的口号愈演愈烈&#xff0c;“低代码能力有没有边界”、“边界在哪”&#xff0c;这…

数据要素化全面提速,数据复制将迎来春天?

数据复制市场将迎来真正的春天&#xff1f; 目前看的确如此。近日&#xff0c;国家发改委密集发文&#xff0c;从产权、分配、流通、安全等多个角度解读“数据二十条”&#xff08; 《中共中央国务院关于构建数据基础制度更好发挥数据要素作用的意见》&#xff0c;简称“数据二…

算法的时间复杂度和空间复杂度(1)

1.算法效率 2.时间复杂度 3.空间复杂度 1.算法效率 如何衡量一个算法的好坏&#xff1f; 比如对于以下斐波那契数列&#xff1a; long long Fib(int N) { if(N < 3) return 1; return Fib(N-1) Fib(N-2)&#xff1b; } 斐波那契数列的递归实现方式非常简洁&#xff0c;但…

SOFA Weekly|SOFA 开源五周年来自社区家人的祝福、社区本周贡献 issue 精选

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展欢迎留言互动&#xff5e;SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&#…

《程序员面试金典(第6版)》面试题 10.05. 稀疏数组搜索(二分法,分治算法入门题目,C++)

题目描述 稀疏数组搜索。有个排好序的字符串数组&#xff0c;其中散布着一些空字符串&#xff0c;编写一种方法&#xff0c;找出给定字符串的位置。 示例1: 输入: words [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”, “”,“dad”, “”, “”], s “t…

2023有哪些便宜好用的蓝牙耳机?性价比最高的无线耳机排行

不管入手什么东西&#xff0c;性价比永远能成为人们入手的最重要的参考要素之一。那么&#xff0c;在蓝牙耳机市场中&#xff0c;有哪些便宜好用的蓝牙耳机&#xff1f;针对这个问题&#xff0c;我来给大家推荐几款性价比最高的无线耳机&#xff0c;一起来看看吧。 一、南卡小音…

采购系统是如何管理供应商的?

随着数字化的推进&#xff0c;企业面临着越来越多的供应商管理问题。企业采购数字化转型已经成为大势所趋&#xff0c;对于采购数字化转型而言&#xff0c;供应商管理是重要一环。 供应商准入管理 在供应商准入阶段&#xff0c;企业需要从供应商资质、财务能力、信誉能力、管理…

vite 安装腾讯im组件TUIKit问题记录

按照vue3ts要求安装依赖包 即时通信 IM Web & H5-含 UI 集成方案&#xff08;荐&#xff09;-文档中心-腾讯云 (tencent.com) 这个版本的文档采用全局安装sass&#xff1a; npm install -g sass sass-loader10.1.1 实际安装后遇到无法解析sass的错误提示&#xff0c;使用…

JumpServer堡垒机部署+基本使用

文章目录JumpServer 堡垒机一、理论知识&#xff1a;1、堡垒机与跳板机的区别2、JumpServer4A认证二、实践实验:1、初始化环境准备2、MySQL数据库部署3、Python3.6 程序部署4、Redis数据库部署5、Core组件部署6、Koko组件部署7、Guacamole组件部署1、安装FFmpeg2、安装Guacamol…

socket 及 字节序转换(嵌入式学习)

socket 及 字节序转换socket简介Socket为什么需要Socket&#xff1f;socket类型Socket通信模型字节序主机字节序到网络字节序网络字节序到主机字节序IP地址转换socket简介 1、1982 - Berkeley Software Distributions 操作系统引入了socket作为本地进程之间通信的接口 2、1986…

SAP MDG —— 使用DIF导入物料主数据 Part2 配置和应用

文章目录关于使用DIF处理物料主数据的相关信息配置定义数据传输对象类型 Object Types文件源和存档目录Web Dynpro 应用导入选项MDG_BS_FILE_IMPORT 的选择项本章小结关于使用DIF处理物料主数据的相关信息 配置 定义数据传输对象类型 Object Types 路径&#xff1a; MDGIMG-…

读懂AUTOSAR :DiagnosticLogAndTrace DLT(四)-- API解析

一、周期调用的函数&#xff1a;Dlt_TxFunction 根据参数DltGeneralTrafficShapingSupport&#xff0c;决定如何去发送DLT消息。如果为TRUE&#xff0c;那需要参考参数DltLogChannelTrafficShapingBandwidth为每个Log通道设置发送带宽&#xff1b;如果为FALSE&#xff0c;那么…

《LKD3粗读笔记》(9)内核同步介绍

文章目录1、临界区和竞争条件2、 加锁3、死锁4、争用和扩展性实现内核同步的意义是什么&#xff1f; 目前内核支持SMP&#xff0c;所以共享资源一定要防止并发访问&#xff0c;如果多个执行线程同时访问和操作数据&#xff0c;就可能发生各线程之间相互覆盖共享数据情况&#x…

ABeam News | 松下家电(中国)生产销售一体化SAP S/4HANA项目正式启动

近日&#xff0c;由德硕管理咨询&#xff08;上海&#xff09;有限公司参与实施的松下家电&#xff08;中国&#xff09;生产销售一体化SAP S/4HANA项目正式上线&#xff0c;松下集团代表董事全球副总裁本间哲朗先生及ABeam大中华区董事长兼总经理中野洋辅先生出席了项目启动会…

【实验报告】实验二 图像空间域频率域滤波

一&#xff0e;实验目的&#xff1a; 1. 模板运算是空间域图象增强的方法&#xff0c;也叫模板卷积。 &#xff08;1&#xff09;平滑&#xff1a;平滑的目的是模糊和消除噪声。平滑是用低通滤波器来完成&#xff0c;在空域中全是正值。 &#xff08;2&#xff09;锐化&…