Python爬虫快速入门,BeautifulSoup基本使用及实践
off999 2024-10-16 11:28 31 浏览 0 评论
来源:Python数据之道
作者:Peter
整理:阳哥
大家好,我是阳哥。
今天来跟大家分享用 BeautifulSoup 获取信息的一些知识点,文章内容由公众号读者 Peter 创作。
欢迎各位童鞋向公众号投稿,点击下面图片了解详情!
爬虫,是学习Python的一个有用的分支,互联网时代,信息浩瀚如海,如果能够便捷的获取有用的信息,我们便有可能领先一步,而爬虫正是这样的一个工具。
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库。由于 BeautifulSoup 是基于 Python,所以相对来说速度会比另一个 Xpath 会慢点,但是其功能也是非常的强大,本文会介绍该库的基本使用方法,帮助读者快速入门。
网上有很多的学习资料,但是超详细学习内容还是非官网莫属,资料传送门:
英文官网:https://www.crummy.com/software/BeautifulSoup/bs4/doc/
中文官网:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/
本文的主要内容如下:
安装和使用
安装
安装过程非常简单,直接使用pip即可:
pip install beautifulsoup4
上面安装库最后的4是不能省略的,因为还有另一个库叫作 beautifulsoup,但是这个库已经停止开发了。
因为BS4在解析数据的时候是需要依赖一定的解析器,所以还需要安装解析器,我们安装强大的lxml:
pip install lxml
在python交互式环境中导入库,没有报错的话,表示安装成功。
使用
使用过程直接导入库:
from bs4 import BeautifulSoup
解析原理
解析原理
- 实例化一个BeautifulSoup对象,并且将本地或者页面源码数据加载到该对象中
- 通过调用该对象中相关的属性或者方法进行标签定位和数据提取
如何实例化BeautifulSoup对象
- 将本地的HTML文档中的数据加载到BS对象中
- 将网页上获取的页面源码数据加载到BS对象中
案例解析
原数据
假设我们现在本地有一个HTML文件待解析,具体内容如下,数据中有各种HTML标签:html、head、body、div、p、a、ul、li等
加载数据
from bs4 import BeautifulSoup
fp = open('./test.html','r',encoding='utf-8') # 打开本地文件
soup = BeautifulSoup(fp,'lxml')
soup
所有的数据解析都是基于soup对象的,下面开始介绍各种解析数据方法:
soup.tagName
soup.TagName返回的是该标签第一次出现的内容,以a标签为例:
数据中多次出现a标签,但是只会返回第一次出现的内容
我们再看下div标签:
出现了2次,但是只会返回第一次的内容:
soup.find('tagName')
find()主要是有两个方法:
- 返回某个标签第一次出现的内容,等同于上面的soup.tagName
- 属性定位:用于查找某个有特定性质的标签
1、返回标签第一次出现的内容:
比如返回a标签第一次出现的内容:
再比如返回div标签第一次出现的内容:
2、属性定位
比如我们想查找a标签中id为“谷歌”的数据信息:
在BS4中规定,如果遇到要查询class情况,需要使用class_来代替:
但是如果我们使用attrs参数,则是不需要使用下划线的:
soup.find_all()
该方法返回的是指定标签下面的所有内容,而且是列表的形式;传入的方式是多种多样的。
1、传入单个指定的标签
image-20210523170401516
上面返回的是列表形式,我们可以获取我们想要的内容:
2、传入多个标签(列表形式)
需要主要返回内容的表达形式,每个标签的内容是单独显示的
3、传入正则表达式
比如查看以a开头标签的全部内容
查看以li标签开头的全部内容:
选择器soup.select()
主要是有3种选择器,返回的内容都是列表形式
- 类选择器:点
- id选择器:#
- 标签选择器:直接指定标签名
1、类选择器
2、id选择器
3、标签选择器
直接指定li标签
4、选择器和find_all()可以达到相同的效果:
soup.tagName和soup.find('tagName')的效果也是相同的:
层级选择器使用
在soup.select()方法中是可以使用层级选择器的,选择器可以是类、id、标签等,使用规则:
- 单层:>
- 多层:空格
1、单层使用
2、多层使用
获取标签文本内容
获取某个标签中对应文本内容主要是两个属性+一个方法:
- text
- string
- get_text()
1、text
2、string
3、get_text()
3者之间的区别
# text和get_text():获取标签下面的全部文本内容
# string:只能获取到标签下的直系文本内容
获取标签属性值
1、通过选择器来获取
2、通过find_all方法来获取
BeautifulSoup实战
下面介绍的是通过BeautifulSoup解析方法来获取某个小说网站上古龙小说名称和对应的URL地址。
网站数据
我们需要爬取的数据全部在这个网址下:https://www.kanunu8.com/zj/10867.html,右键“检查”,查看对应的源码,可以看到对应小说名和URL地址在源码中位置
每行3篇小说在一个tr标签下面,对应的属性href和文本内容就是我们想提取的内容。
获取网页源码
import requests
from bs4 import BeautifulSoup
import pandas as pd
import re
url = 'https://www.kanunu8.com/zj/10867.html'
headers = {'user-agent': '个人请求头'}
response = requests.get(url = url,headers = headers)
result = response.content.decode('gbk') # 该网页需要通过gbk编码来解析数据
# result
实例化BeautifulSoup对象
soup1 = BeautifulSoup(result,'lxml')
# print(soup1.prettify()) 美化输出源码内容
获取名称和URL地址
1、先获取整体内容
两个信息全部指定a标签中,我们只需要获取到a标签,通过两个属性href和target即可锁定:
# 两个属性href和target,不同的方法来锁定
information_list = soup1.find_all('a',href=re.compile('^/book'),target='_blank')
information_list
2、再单独获取两个信息
通过属性来获取URL地址,通过文本来获取名称
url_list = []
name_list = []
for i in information_list:
url_list.append(i['href']) # 获取属性
name_list.append(i.text) # 获取文本
3、生成数据帧
gulong = pd.DataFrame({
"name":name_list,
"url":url_list}
)
gulong
我们发现每部小说的具体地址其实是有一个公共前缀的:https://www.kanunu8.com/book,现在给加上:
gulong['url'] = 'https://www.kanunu8.com/book' + gulong['url'] # 加上公共前缀
gulong.head()
另外,我们想把书名的《》给去掉,使用replace替代函数:
gulong["name"] = gulong["name"].apply(lambda x:x.replace("《","")) # 左边
gulong["name"] = gulong["name"].apply(lambda x:x.replace("》","")) # 右边
# 保存
gulong.to_csv("gulong.csv",index=False) # 保存到本地的csv文件
最后显示的前5行数据:
总结
本文从BeautifulSoup4库的安装、原理以及案例解析,到最后结合一个实际的爬虫实现介绍了一个数据解析库的使用,文中介绍的内容只是该库的部分内容,方便使用者快速入门,希望对读者有所帮助。
相关推荐
- Python函数参数和返回值类型:让你的代码更清晰、更健壮
-
在Python开发中,你是否遇到过这些抓狂时刻?同事写的函数参数类型全靠猜调试两小时发现传了字符串给数值计算函数重构代码时不知道函数返回的是列表还是字典今天教你两招,彻底解决类型混乱问题!让你的...
- 有公司内部竟然禁用了python开发,软件开发何去何从?
-
今天有网友在某社交平台发文:有公司内部竟然禁止了python开发!帖子没几行,评论却炸锅了。有的说“太正常,Python本就不适合做大项目”,还有的反驳“飞书全员用Python”。暂且不说这家公司...
- 写 Python 七年才发现的七件事:真正提高生产力的脚本思路
-
如果你已经用Python写了不少脚本,却总觉得代码只是“能跑”,这篇文章或许会刷新你对这门语言的认知。以下七个思路全部来自一线实战,没有花哨的概念,只有可落地的工具与习惯。它们曾帮我省下大量无意义...
- 用Python写一个A*搜索算法含注释说明
-
大家好!我是幻化意识流。今天我们用Python写一个A*搜索算法的代码,我做了注释说明,欢迎大家一起学习:importheapq#定义搜索节点类,包括当前状态、从初始状态到该状态的代价g、从该状态...
- 使用python制作一个贪吃蛇游戏,并为每一句添加注释方便学习
-
今天来设计一个贪吃蛇的经典小游戏。先介绍下核心代码功能(源代码请往最后面拉):游戏功能:-四个难度等级:简单(8FPS)、中等(12FPS)、困难(18FPS)、专家(25FPS)-美...
- Python 之父 Guido van Rossum 宣布退休
-
Python之父GuidovanRossum在推特公布了自己从Dropbox公司离职的消息,并表示已经退休。他还提到自己在Dropbox担任工程师期间学到了很多东西——Python的类型注解(T...
- 4 个早该掌握的 Python 类型注解技巧
-
在Python的开发过程中,类型注解常常被忽视。但当面对一段缺乏类型提示、逻辑复杂的代码时,理解和维护成本会迅速上升,极易陷入“阅读地狱”。本文整理了4个关于Python类型注解的重要技巧...
- 让你的Python代码更易读:7个提升函数可读性的实用技巧
-
如果你正在阅读这篇文章,很可能你已经用Python编程有一段时间了。今天,让我们聊聊可以提升你编程水平的一件事:编写易读的函数。请想一想:我们花在阅读代码上的时间大约是写代码的10倍。所以,每当你创建...
- Python异常模块和包
-
异常当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”,也就是我们常说的BUG例如:以`r`方式打开一个不存在的文件。f=open('...
- 别再被 return 坑了!一文吃透 Python return 语句常见错误与调试方法
-
Pythonreturn语句常见错误与调试方法(结构化详解)一.语法错误:遗漏return或返回值类型错误错误场景pythondefadd(a,b):print(a+b)...
- Python数据校验不再难:Pydantic库的工程化实践指南
-
在FastAPI框架横扫Python后端开发领域的今天,其默认集成的Pydantic库正成为处理数据验证的黄金标准。这个看似简单的库究竟隐藏着哪些让开发者爱不释手的能力?本文将通过真实项目案例,带您解...
- python防诈骗的脚本带注释信息
-
以下是一个简单但功能完整的防诈骗脚本,包含URL检测、文本分析和风险评估功能。代码结构清晰,带有详细注释,适合作为个人或家庭防诈骗工具使用。这个脚本具有以下功能:文本诈骗风险分析:检测常见诈骗关键...
- Python判断语句
-
布尔类型和比较运算符布尔类型的定义:布尔类型只有两个值:True和False可以通过定义变量存储布尔类型数据:变量名称=布尔类型值(True/False)布尔类型不仅可以自行定义,同时也可通过...
- 使用python编写俄罗斯方块小游戏并为每一句添加注释,方便学习
-
先看下学习指导#俄罗斯方块游戏开发-Python学习指导##项目概述这个俄罗斯方块游戏是一个完整的Python项目,涵盖了以下重要的编程概念:-面向对象编程(OOP)-游戏开发基础-数据...
- Python十大技巧:不掌握这些,你可能一直在做无用功!
-
在编程的世界里,掌握一门语言只是起点,如何写出优雅、高效的代码才是真功夫。Python作为最受欢迎的编程语言之一,拥有简洁明了的语法,但要想真正精通这门语言,还需要掌握一些实用的高级技巧。一、列表推导...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)