Python的解析网页
课前案例
通过requests模块爬取指定网站中的图片并保存到本地目录中。
上述案例采用的是同步方式下载图片,效率太低。异步方式如下(线程):
# target为目标函数;args中传入的是download函数的参数url threading.Thread(target=download,args=(url,)).start()
注意:args
为元组格式,如果传入一个参数注意后面必须跟着一个逗号;线程配置完毕之后记得调用start方法启动线程。
Beautiful Soup
什么是Beautiful Soup
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.
解析器
Beautiful Soup
支持Python
标准库中的HTML解析器,还支持一些第三方的解析器:
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(markup, "html.parser") | Python的内置标准库执行速度适中文档容错能力强 | Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差 |
lxml HTML 解析器 | BeautifulSoup(markup, "lxml") | 速度快文档容错能力强 | 需要安装C语言库 |
lxml XML 解析器 | BeautifulSoup(markup, ["lxml-xml"])``BeautifulSoup(markup, "xml") | 速度快唯一支持XML的解析器 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup, "html5lib") | 最好的容错性以浏览器的方式解析文档生成HTML5格式的文档 | 速度慢不依赖外部扩展 |
安装与配置
# 安装requests模块 pip install requests==2.10.0 # 安装beautiful soup4 pip install bs4 # 安装lxml解析器 pip install lxml
快速入门
将课件资料中的index.html
文件复制到python
项目中即可。
解析数据
标签
每个tag都有自己的名字,通过soup.name
来获取标签。
# 获取p标签 p = soup.p print(p) # 获取title标签 title = soup.title print(title)
注意:如果有多个相同的标签,则会返回第一个。
属性
一个标签可能有很多个属性。例如:标签 <b class="boldest">
有一个 class
的属性,值为 boldest
。标签的属性的操作方法与字典相同。
-
获取指定标签的单一属性,类似字典方式
# 获取p标签的class属性 attrs = soup.p["class"] print(attrs)
注意:最常见的多值的属性是 class (一个标签可以有多个CSS
的class
). 还有一些属性 rel
, rev
, accept-charset
, headers
, accesskey
. 在Beautiful Soup
中多值属性的返回类型是list
。
-
获取指定标签的单一属性,通过
attrs
方式
# 通过attrs获取p标签的id属性 id_ = soup.p.attrs["id"] print(id_)
-
获取指定标签的所有属性:
# 获取指定标签的所有属性 p_attrs = soup.p.attrs print(p_attrs)
标签内容
通过.text
和.string
获取标签节点的内容,也可以通过.strings
获取标签节点下的所有内容。
# 获取单个标签的内容 text = soup.p.text print(text) print(soup.p.string) # 获取该标签下所有的内容,返回generator生成器 strings = soup.div.strings for st in strings:print(st)
遍历文档树
子节点
标签小技巧获取层级子节点:
# tag小技巧获取层级子节点 print(soup.body.div.p)
.contents
:将标签的子节点以列表的方式输出
# 获取div标签下的所有子节点 print(soup.body.div.contents) # 获取div标签下的第二个子节点 print(soup.body.div.contents[1]) # 获取div标签下的第二个子节点的标签名 print(soup.body.div.contents[1].name) # 获取div标签下的第二个子节点的所有属性 print(soup.body.div.contents[1].attrs)
.children
:对标签的子节点进行循环
# 获取div下的的子节点 children = soup.body.div.children print(children) # 循环打印节点信息 for child in children:print(child)
.descendants
:对所有标签的子孙节点进行递归循环
descendants = soup.body.descendants for des in descendants:print(des)
更多内容请查看官网子节点。
父节点
.parent
:获取某个元素的父节点
print(soup.p.parent)
.parents
:递归得到元素的所有父辈节点
parents = soup.p.parents for p in parents:print(p)
更多内容请查看官网父节点。
兄弟节点
.next_sibling
:获取下级单个兄弟节点
print(soup.p.next_sibling.next_sibling)
.previous_sibling
:获取上级单个兄弟节点
print(soup.body.previous_sibling.previous_sibling)
注意:在使用.next_sibling
和.previous_sibling
获取单个兄弟节点时,兄弟节点之间存在顿号和换行符的可能!!!
更多内容请查看官网兄弟节点。
搜索文档树
find
find方法,语法格式如下:
find( name , attrs , recursive , string , **kwargs )
参数说明:
参数 | 说明 |
---|---|
name | 需要查找的标签名,可以是字符串、正则表达式、列表或True |
attrs | 需要查找的标签的属性,可以是字典类型或关键字参数 |
recursive | 是否递归地搜索子标签,默认为True ,即会搜索所有子孙标签 |
string | 需要查找的标签中包含的文本内容 |
kwargs | 其他属性条件 |
通过find
方法搜索指定的标签。
print(soup.find('p', class_="aa")) print(soup.find('p', class_="aa", id="username"))
注意:class类样式的处理。
True
可以匹配任何值,如下示例返回第一个节点:
print(soup.find(True))
更多内容请查看官网。
find_all
find_all()
方法的基本语法如下:
find_all(name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
参数说明:
参数 | 说明 |
---|---|
name | 需要查找的标签名,可以是字符串、正则表达式、列表或True |
attrs | 需要查找的标签的属性,可以是字典类型或关键字参数 |
recursive | 是否递归地搜索子标签,默认为True ,即会搜索所有子孙标签 |
text | 需要查找的标签中包含的文本内容 |
limit | 限制返回的结果数量,可以传入一个整数值 |
返回值:
-
如果找到满足条件的元素,则返回一个包含这些元素的列表。
-
如果未找到满足条件的元素,则返回一个空列表。
find_add
方法搜索当前标签下所有子节点,并判断是否符合过滤器的条件。
all = soup.find_all('p') for a in all:print(a) print(soup.find_all(["p", "input"]))
更多内容请查看官网。
css选择器
Beautiful Soup
支持大部分的CSS
选择器。在 Tag
或 BeautifulSoup
对象的 .select()
方法中传入字符串参数, 即可使用CSS
选择器的语法找到标签:
print(soup.select("title")) print(soup.select("body div")) print(soup.select("p.aa"))
3.综合案例
通过requests
和Beautiful Soup4
模块结合实现小说网站内容爬虫案例。
相关文章:

Python的解析网页
课前案例 通过requests模块爬取指定网站中的图片并保存到本地目录中。 上述案例采用的是同步方式下载图片,效率太低。异步方式如下(线程): # target为目标函数;args中传入的是download函数的参数url threading.Threa…...

VBA技术资料MF159:实现某个区域内的数据滚动
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…...

开源DMS文档管理系统 Nuxeo Vs Alfresco对比及 API 使用概述
1. 文档管理系统是什么 文档管理系统(DMS:Document Management System)是一种软件系统,用于组织、存储、检索和管理电子文档和文件。这些文件可以是各种格式的电子文档,如文本文档、电子表格、图像、音频或视频文件等…...

lambda函数实践
文章目录 1.简单实例2.lambda函数使用3.捕获列表的使用4.lambda表达式的应用1.简单实例 2.lambda函数使用 3.捕获列表的使用 4.lambda表达式的应用 #include <iostream> #include <vector>using namespace std;/** 1.简单实例* 2.lambda函数使用* 3.捕获列表的…...

[leetcode hot 150]第一百九十一题,位1的个数
题目: 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中设置位的个数(也被称为汉明重量)。 这道题比较简单,直接对最后一位进行与1的与操作,然…...

gitea的git库备份与恢复
文章目录 gitea库的备份与恢复概述笔记实验环境更新git for windows更新 TortoiseGit备份已经存在的gitea的git库目录使用gitea本身来备份所有git库目录将gitea库恢复到新目录m1m2m3启动gitea - 此时已经恢复完成FETCH_HEAD 中有硬写位置再查一下app.ini, 是否改漏了。m1m2 总结…...

【强化学习05】从Q学习到深度Q学习
深度Q学习(Deep Q-Learning, DQN)是将深度学习与Q学习结合起来的一种强化学习方法,利用神经网络来近似Q值函数,解决传统Q学习在大规模或连续状态空间中的局限性。下面详细解释DQN的机理。 背景知识 Q学习 Q学习是一种值函数法&…...

FPGA实现多路并行dds
目录 基本原理 verilog代码 仿真结果 基本原理 多路并行dds,传统DDS的局限性在于输出频率有限。根据奈奎斯特采样定理,单路DDS的输出频率应小于系统时钟频率的一半。但是在很多地方,要使采样率保持一致,所以,为了…...

ArcgisPro3.1.5安装手册
ArcgisPro3.1.5安装手册 一、目录介绍: 二、安装教程: (1)安装顺序:最先安装运行环境(runtime6.0.5),接着安装install里面的文件,最后复制path里面的文件替换到软件bin文件夹下即可。 (2)具体安装步骤ÿ…...

三大主流框架
Web前端开发领域中,三大主流框架通常指的是: React:由Facebook开发的一个用于构建用户界面的JavaScript库。React以其组件化、声明式编程和虚拟DOM等特点而广受欢迎,能够高效地更新和渲染大型应用。 Vue.js:由尤雨溪创…...

【C++】:vector容器的底层模拟实现迭代器失效隐藏的浅拷贝
目录 💡前言一,构造函数1 . 强制编译器生成默认构造2 . 拷贝构造3. 用迭代器区间初始化4. 用n个val值构造5. initializer_list 的构造 二,析构函数三,关于迭代器四,有关数据个数与容量五,交换函数swap六&am…...

必看项目|多维度揭示心力衰竭患者生存关键因素(生存分析、统计检验、随机森林)
1.项目背景 心力衰竭是一种严重的公共卫生问题,影响着全球数百万人的生活质量和寿命,心力衰竭的病因复杂多样,既有个体生理因素的影响,也受到环境和社会因素的制约,个体的生活方式、饮食结构和医疗状况在很大程度上决定了其心力衰竭的风险。在现代社会,随着生活水平的提…...

centos安装Redis
在CentOS上安装Redis的步骤如下: 使用yum安装依赖库: sudo yum install -y gcc make 下载Redis源码: wget http://download.redis.io/releases/redis-6.0.9.tar.gz 解压Redis源码: tar xzf redis-6.0.9.tar.gz 编译Redis&…...

继承与多态2
2.5(杨.丹尼尔梁英文第11版P537:*13.12)(几何对象的面积求和)写一个方法,将数组中所有几何对象的面积求和。 方法签名是: 公共静态双求和区域(几何对象【】a) 编写一个测试程序&…...

在RT-Thread下为MPU手搓以太网MAC驱动-3
文章目录 MAC驱动支持不同的PHY芯片关于对PHY设备抽象的改进RT-Thread下PHY设备抽象接口的改进关于对PHY设备抽象的改进 这是个人驱动开发过程中做的一些记录,仅代表个人意见和理解,不喜勿喷 MAC驱动需要支持不同的PHY芯片 MAC驱动支持不同的PHY芯片 关…...

Cocos Creator 2D物理引擎的使用详解
前言 Cocos Creator是一款优秀的游戏开发工具,它提供了强大的2D物理引擎,帮助开发者轻松实现游戏中的物理效果。在本文中,我们将详细介绍Cocos Creator中2D物理引擎的使用方法,并通过代码实现来演示其具体应用。 对惹࿰…...

618局外人抖音:别人挤压商家“拼价格”,它默默联合商家“抢用户”?
文|新熔财经 作者|宏一 “618”来临之际,各电商平台和短视频平台早已打响了“促销大战”。不过,今年各大平台都更积极适应新的消费形式,调整了“大促动作”。 比如淘宝、京东带头取消了沿用十年之久的预售机制&…...

【Unity AR开发插件】五、运行示例程序
专栏 本专栏将介绍如何使用这个支持热更的AR开发插件,快速地开发AR应用。 链接: Unity开发AR系列 热更数据制作:制作热更数据-AR图片识别场景 插件简介 通过热更技术实现动态地加载AR场景,简化了AR开发流程,让用户可…...

JavaScript className 类名属性操作
在JavaScript中,可以通过className属性来操作HTML元素的类名。 添加类名:可以使用element.className "className"来添加一个类名到元素中。 var element document.getElementById("myElement"); element.className " newC…...

做场外个股期权怎么询价
做场外个股期权怎么询价?没有具体的哪家做市商是询价是最低的,个人投资者需要通过机构通道方询价进行对比,各券商的报价由询价机构方提供给到投资者,可以参考不同券商的报价进行比对,再决定是否进行投资。本文来自&…...

Databend 开源周报第 146 期
Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 支持 Expressio…...

Android12.0 SIM卡语言自适应
文章目录 需求语言设定Settings中语言切换流程检测到SIM卡,更新系统语言最终修改 需求 要求系统语言跟随SIM卡的语言变化。 语言设定 (1)系统预置语言, 即在makefile中指定的语言 (2)重启, 如果未插卡, 则系统语言为预置的语言 (3)重启插入SIM卡开机, 会自适应为…...

滴滴一季度营收同比增长14.9%至491亿元 经调整EBITA盈利9亿元
【头部财经】5月29日,滴滴在其官网发布2024年一季度业绩报告。一季度滴滴实现总收入491亿元,同比增长14.9%;经调整EBITA(非公认会计准则口径)盈利9亿元。其中,中国出行一季度实现收入445亿元,同…...

C语言 指针——指针变量的定义、初始化及解引用
目录 指针 内存如何编址? 如何对变量进行寻址? 用什么类型的变量来存放变量的地址? 如何显示变量的地址?编辑 使用未初始化的指针会怎样? NULL是什么? 如何访问指针变量指向的存储单元中的数据? 指针变量的…...

详解 Spark 的运行架构
一、核心组件 1. Driver Spark 驱动器节点,用于执行 Spark 任务中的 main 方法,负责实际代码的执行工作主要负责: 将用户程序转化为作业 (job)在 Executor 之间调度任务 (task)跟踪 Executor 的执行情况通过 UI 展示查询运行情况 2. Exec…...

盲盒小程序开发,为市场带来的新机遇
近年来,盲盒市场一直处于热门行业中,发展非常快速。在互联网的支持下,也衍生出了线上盲盒小程序,实现了线上线下双发展的态势。 盲盒小程序作为一种新的盲盒购物方式,受到了盲盒消费者的喜爱,为盲盒行业的…...

stm32学习-流水灯
接线 注意:LED灯长一点的引脚是正极。 配置GPIO 1.使用RCC开启GPIO时钟 void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); void RCC_APB1Perip…...

GIGE 协议摘录
系列文章目录 GIGE 学习笔记 GIGE 协议摘录 文章目录 系列文章目录引言第 1 章 设备发现1.1 链路选择1.1.1 单链路配置1.1.2 多链路配置1.1.3 链路聚合组配置 LAG 1.2 IP配置1.2.1 协议选择1.2.2 静态IP1.2.3 DHCP1.2.4 链接本地地址 LLA 1.3 设备枚举1.3.1 GVCP设备发现广播设…...

服务器的远程桌面无法连接,服务器远程桌面无法连接问题处理教程
服务器的远程桌面无法连接,服务器远程桌面无法连接问题处理教程。 一、问题概述 服务器远程桌面无法连接是日常运维中常见的问题之一。它可能由多种原因造成,如网络问题、服务器配置错误、远程桌面服务未启动等。本教程将指导您逐步排查并解决这些问题。…...

【机器学习300问】105、计算机视觉(CV)领域有哪些子任务?
计算机视觉作为人工智能的重要分支,发展至今已经在诸多领域取得显著的成果。在众多的计算机视觉任务中,图像分类、目标检测与定位、语义分割和实例分割是四个基本而关键的子任务,它们在不同的应用场景下扮演着重要角色。这四个子任务虽然各具…...