Python的解析网页

news2025/1/18 19:52:28

课前案例

通过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语言库
html5libBeautifulSoup(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 (一个标签可以有多个CSSclass). 还有一些属性 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选择器。在 TagBeautifulSoup 对象的 .select() 方法中传入字符串参数, 即可使用CSS选择器的语法找到标签:

print(soup.select("title"))
print(soup.select("body div"))
print(soup.select("p.aa"))

3.综合案例

通过requestsBeautiful Soup4模块结合实现小说网站内容爬虫案例。

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

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

相关文章

【iOS】——工厂设计模式

文章目录 一、设计模式创建型模式结构型模式行为型模式 二、设计模式七大准则三、简单工厂模式四、工厂方法模式五、抽象工厂模式 一、设计模式 设计模式是指在特定上下文中解决常见问题时所采用的一套可复用的解决方案。这些模式是面向对象编程中的通用概念&#xff0c;广泛应…

Spring学习⑤__Spring AOP的高级应用

Spring AOP的应用配置 Spring中的事务管理 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言&#xff08;如SQL&#xff0c;C或Java&#xff09;书写的用户 程序的执行所引起&#xff0c;并用形如begi…

ABB工业机器人伺服驱动器维修

ABB机器人驱动器是机器人的核心部件&#xff0c;负责驱动机器人的关节进行各种动作。因此&#xff0c;对ABB工业机械手驱动器维修和维护至关重要。 一、ABB机械臂驱动器故障诊断 在ABB工业机器人驱动器维修之前&#xff0c;首先需要准确诊断故障。以下是一些常见的故障诊断方法…

多线程新手村3--多线程代码案例

1.1 单例模式 单例模式是设计模式中非常经典的一种。那么有同学肯定就会好奇了&#xff0c;什么是设计模式呢&#xff1f; 设计模式简单的说就是程序员的“棋谱”&#xff0c;我们下象棋时肯定或多或少都背过棋谱&#xff0c;例如当头炮、马后炮等&#xff0c;设计模式也是这…

【病毒分析】Babuk勒索家族babyk后缀系列分析--Windows篇

1.背景 1.1 Babuk勒索家族 Babuk勒索家族最早曝光于2021年1月初&#xff0c;在几个月内&#xff0c;它就跻身于最臭名昭著的勒索软件组织之列。自回归以来&#xff0c;它通过在地下论坛上积极宣传自己而获得了更多的知名度。在策略方面&#xff0c;其加密功能与其他勒索软件组…

C++|set、map模拟实现<——红黑树

目录 一、红黑树的迭代器 1.1红黑树迭代器框架 1.2operator*() && operator->() 1.3operator() 1.4operator--() 1.5operator() && operator!() 1.6begin() && end() 二、如何用红黑树搭配map和set(仿函数) 三、红黑树封装map和set(简易版…

图片怎么批量重命名从1到50?这3个方法一键改名

图片怎么批量重命名从1到50&#xff1f;图片批量重命名从1到50的过程不仅提高了我们处理大量图片文件的效率&#xff0c;还大大简化了命名过程&#xff0c;让我们能更加有条理地管理和存储图片。通过使用各种专业的工具和方法&#xff0c;我们可以轻松实现图片文件的自动化命名…

【美羊羊拿金币问题】

问题&#xff1a; 有一天美羊羊正在草地上玩耍&#xff0c;突然天上开始落金币&#xff0c;这些金币掉落的范围在一个固定的水平区域内&#xff0c;但这些金币一旦掉落到地上就消失了&#xff0c;因此美羊羊只有不断地移动并从空中接住这些金币才能得到它们。假设金币掉落的位…

宝兰德入选“鑫智奖·2024金融数据智能运维创新优秀解决方案”榜单

近日&#xff0c;由金科创新社主办、全球金融专业人士协会支持的“2024 鑫智奖第六届金融数据智能优秀解决方案”评选结果正式公布。凭借卓越的技术实力和方案能力&#xff0c;宝兰德「智能全链路性能监控解决方案」从90个参选方案中脱颖而出&#xff0c;荣誉入选“鑫智奖2024金…

关于C++的IO流简单总结

基础IO流 C的IO以面向对象的形式实现, 同时兼容了C语言面向过程的IO方式 C 标准库提供了四个基本流对象&#xff1a; cin&#xff1a;用于从标准输入&#xff08;通常是键盘&#xff09;读取数据。 cout&#xff1a;用于向标准输出&#xff08;通常是控制台&#xff09;写入…

【云原生】kubernetes中的认证、权限设置--RBAC授权原理分析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

自动化使用 ChatGPT 生成 PPT 大纲 - 基于 Python 和 PyAutoGUI

这篇文章将指导您利用 Python 的 pyautogui 库创建一个自动化的脚本&#xff0c;帮助您使用 ChatGPT 生成公司智能管理平台的 PPT 大纲。该脚本将打开 Chrome 浏览器&#xff0c;访问 ChatGPT 并输入相应的提示词&#xff0c;让 ChatGPT 为您创建 PPT 大纲。 C:\pythoncode\ne…

为什么宋以前权臣篡位多、宋以后权臣篡位少?

时代不同&#xff0c;主要问题也不同。天下的大气候&#xff0c;自然就要左右王朝的小气候。权臣篡位&#xff0c;得先有权臣。但是&#xff0c;如果当权臣都没有了&#xff0c;又怎么可能有权臣篡位呢&#xff1f;这是一个社会基础的变化。宋以后的主要矛盾是中原和草原的争锋…

白酒:白酒产地的地域文化与品牌形象

云仓酒庄豪迈白酒&#xff0c;作为中国白酒的一部分&#xff0c;其品牌形象深受产地的地域文化影响。地域文化是一个地区与众不同的文化传统和价值观&#xff0c;它影响着当地人的生活方式和审美观念&#xff0c;进而影响白酒的品牌形象。 首先&#xff0c;白酒产地的历史与传统…

质量工具系列之Dependency-Track

项目开发中依赖了很多第三方开源工具&#xff0c;对于其版本&#xff0c;漏洞等因为时间或者是数量太多而无法关注到&#xff0c;Dependency-Track解决这些问题。 Dependency-Track 是一个开源组件分析平台&#xff0c;是开放网络应用安全项目&#xff08;OWASP&#xff09;的一…

电源小白入门学习8——电荷泵电路原理及使用注意事项

电源小白入门学习8——电荷泵电路原理及使用注意事项 电荷泵简介电荷泵原理电荷泵设计过程中需要注意的点fly电容的安秒平衡DC/DC功率转换技术对比 电荷泵简介 电荷泵&#xff08;Charge Pump&#xff09;是一种电路拓扑结构&#xff0c;用于实现电压升压或降压的功能。它通过…

实战15:bert 命名实体识别、地址解析、人名电话地址抽取系统-完整代码数据

直接看项目视频演示: bert 命名实体识别、关系抽取、人物抽取、地址解析、人名电话地址提取系统-完整代码数据_哔哩哔哩_bilibili 项目演示: 代码: import re from transformers import BertTokenizer, BertForTokenClassification, pipeline import os import torch im…

POLARDB:新零售用户MySQL上云最佳选择

什么是云数据库POLARDB&#xff1f; POLARDB是阿里云自主研发的最新一代RDS关系型数据库&#xff0c;是特别针对互联网场景设计的Cloud-Native 云原生数据库。POLARDB for MySQL版本&#xff0c;在提供100%兼容MySQL5.6/8.0的关系型事务处理ACID特性之上&#xff0c;能够提供完…

【NumPy】掌握NumPy的histogram函数:数据直方图的生成与应用详解

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

基于序列深度学习模型的向量海岸线形状分类方法 2024.05

本文中提出了一个数据驱动的方法来分类的形状矢量海岸线&#xff0c;该方法利用基于序列的深度学习算法对海岸线矢量分段进行建模和分类。具体而言&#xff0c;首先将复杂的海岸线划分为一系列弯曲&#xff0c;并进一步提出了一组不同的特征来描述每个弯曲的形态特征。然后&…