python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)


Posted in Python onFebruary 19, 2021

【python爬虫基础入门】系列是对python爬虫的一个入门练习实践,旨在用最浅显易懂的语言,总结最明了,最适合自己的方法,本人一直坚信,总结才会使人提高

1. BeautifulSoup库简介

BeautifulSoup库在python中被美其名为“靓汤”,它和和 lxml 一样也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,若在没用安装此库的情况下, Python 会使用 Python默认的解析器lxml,lxml 解析器更加强大,速度更快,而BeautifulSoup库中的lxml解析器则是集成了单独的lxml的特点,使得功能更加强大。

需要注意的是,Beautiful Soup已经自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。因此在使用它的时候不需要考虑编码方式,仅仅需要说明一下原始编码方式就可以了。

使用pip命令工具安装BeautifulSoup4库

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ BeautifulSoup # 使用清华大学镜像源安装

2. BeautifulSoup库的主要解析器

在代码中 html.parser是一种针对于html网页页面的解析器,Beautiful Soup库还有其他的解析器,用于针对不同的网页

demo = 'https://www.baidu.com'
soup = BeautifulSoup(demo,'html.parser')

解析器 使用方法 条件
bs4的html解析器 BeautifulSoup(demo,‘html.parser') 安装bs4库
lxml的html解析器 BeautifulSoup(demo,‘lxml') pip install lxml
lxml的xml解析器 BeautifulSoup(demo,‘xml') pip install lxml
html5lib的解析器 BeautifulSoup(demo,‘html5lib') pip install html5lib

3. BeautifulSoup的简单使用

假如有一个简单的网页,提取百度搜索页面的一部分源代码为例

<!DOCTYPE html>
<html>
<head>
 <meta content="text/html;charset=utf-8" http-equiv="content-type" />
 <meta content="IE=Edge" http-equiv="X-UA-Compatible" />
 <meta content="always" name="referrer" />
 <link
href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.
css" rel="stylesheet" type="text/css" />
 <title>百度一下,你就知道 </title>
</head>
<body link="#0000cc">
 <div >
 <div >
 <div >
  <div >
  <a href="http://news.baidu.com" rel="external nofollow" rel="external nofollow" name="tj_trnews">新闻
</a>
  <a href="https://www.hao123.com" rel="external nofollow" 
name="tj_trhao123">hao123 </a>
  <a href="http://map.baidu.com" rel="external nofollow" name="tj_trmap">地图 </a>
  <a href="http://v.baidu.com" rel="external nofollow" name="tj_trvideo">视频 </a>
  <a href="http://tieba.baidu.com" rel="external nofollow" name="tj_trtieba">贴吧
</a>
  <a href="//www.baidu.com/more/" rel="external nofollow" name="tj_briicon"
>更多产品 </a>
  </div>
 </div>
 </div>
 </div>
</body>
</html>

结合requests库和使用BeautifulSoup库的html解析器,对其进行解析有如下

import requests
from bs4 import BeautifulSoup

# 使用Requests库加载页面代码
r = requests.get('https://www.baidu.com')
r.raise_for_status()  # 状态码返回
r.encoding = r.apparent_encoding
demo = r.text

# 使用BeautifulSoup库解析代码
soup = BeautifulSoup(demo,'html.parser')  # 使用html的解析器

print(soup.prettify())   # prettify 方式输出页面

python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)

4. BeautifuSoup的类的基本元素

BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,BeautifulSoup库有针对于html的标签数的特定元素,重点有如下三种

<p > ... </p>
  • Tag
  • NavigableString
  • Comment
  • BeautifulSoup

基本元素 说明
Tag 标签,最基本的信息组织单元,分别用和>标明开头和结尾,格式:soup.a或者soup.p(获取a标签中或者p标签中的内容)
Name 标签的名字, … 的名字是‘p' 格式为:.name
Attributes 标签的属性,字典形式组织,格式:.attrs
NavigableString 标签内非属性字符串,…>中的字符串,格式:.string
Comment 标签内的字符串的注释部分,一种特殊的Comment类型

4.1 Tag

标签是html中的最基本的信息组织单元,使用方式如下

from bs4 import BeautifulSoup
html = 'https://www.baidu.com'
bs = BeautifulSoup(html,"html.parser")

print(bs.title) # 获取title标签的所有内容
print(bs.head) # 获取head标签的所有内容
print(bs.a)  # 获取第一个a标签的所有内容
print(type(bs.a))	# 类型

在Tag标签中最重要的就是html页面中的name哈attrs属性,使用方式如下

print(bs.name)
print(bs.head.name)			# head 之外对于其他内部标签,输出的值便为标签本身的名称
print(bs.a.attrs) 			# 把 a 标签的所有属性打印输出了出来,得到的类型是一个字典。
print(bs.a['class']) 		# 等价 bs.a.get('class') 也可以使用get方法,传入属性的名称,二者是等价的
bs.a['class'] = "newClass" # 对这些属性和内容进行修改
print(bs.a)
del bs.a['class']			# 对这个属性进行删除
print(bs.a)

4.2 NavigableString

NavigableString中的string方法用于获取标签内部的文字

from bs4 import BeautifulSoup
html = 'https://www.baidu.com'
bs = BeautifulSoup(html,"html.parser")
print(bs.title.string)
print(type(bs.title.string))

4.3 Comment

Comment 对象是一个特殊类型的 NavigableString 对象,其输出的内容不包括注释符号,用于输出注释中的内容

from bs4 import BeautifulSoup
html = 'https://www.baidu.com'
bs = BeautifulSoup(html,"html.parser")
print(bs.a)
# 标签中的内容<a href="http://news.baidu.com" rel="external nofollow" rel="external nofollow" name="tj_trnews"><!--新闻--></a>
print(bs.a.string) 		# 新闻
print(type(bs.a.string)) # <class 'bs4.element.Comment'>

5. 基于bs4库的HTML内容的遍历方法

在HTML中有如下特定的基本格式,也是构成HTML页面的基本组成成分

python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)

而在这种基本的格式下有三种基本的遍历流程

  • 下行遍历
  • 上行遍历
  • 平行遍历

三种种遍历方式分别是从当前节点出发。对之上或者之下或者平行的格式以及关系进行遍历

5.1 下行遍历

下行遍历有三种遍历的属性,分别是

  • contents
  • children
  • descendants

属性 说明
.contents 子节点的列表,将所有儿子节点存入列表
.children 子节点的迭代类型,用于循环遍历儿子节点
.descendants 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历

使用举例

soup = BeautifulSoup(demo,'html.parser') 

# 循环遍历儿子节点
for child in soup.body.children:
	print(child)

# 循环遍历子孙节点 
for child in soup.body.descendants:
 print(child)
 
# 输出子节点的列表形式
print(soup.head.contents)
print(soup.head.contents[1])	# 用列表索引来获取它的某一个元素

5.2 上行遍历

上行遍历有两种方式

  • parent
  • parents

属性 说明
.parent 节点的父亲标签
.parents 节点先辈标签的迭代类型,用于循环遍历先辈节点,返回一个生成器
使用举例
soup = BeautifulSoup(demo,'html.parser') 

for parent in soup.a.parents:
	if parent is None:
		parent(parent)
	else:
		print(parent.name)

5.3 平行遍历

平行遍历有四种属性

  • next_sibling
  • previous_sibling
  • next_siblings
  • previous_siblings

属性 说明
.next_sibling 返回按照HTML文本顺序的下一个平行节点标签
.previous_sibling 返回按照HTML文本顺序的上一个平行节点标签
.next_siblings 迭代类型,返回按照html文本顺序的后续所有平行节点标签
.previous_siblings 迭代类型,返回按照html文本顺序的前序所有平行节点标签

python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)

平行遍历举例如下

for sibling in soup.a.next_sibling:
	print(sibling)		# 遍历后续节点
	
for sibling in soup.a.previous_sibling:
	print(sibling)		# 遍历

5.4 其他遍历

属性 说明
.strings 如果Tag包含多个字符串,即在子孙节点中有内容,可以用此获取,而后进行遍历
.stripped_strings 与strings用法一致,可以去除掉那些多余的空白内容
.has_attr 判断Tag是否包含属性

6. 文件树搜索

使用soup.find_all(name,attrs,recursive,string,**kwargs)方法,用于返回一个列表类型,存储查找的结果

  • name:对标签名称的检索字符串
  • attrs:对标签属性值得检索字符串,可标注属性检索
  • recursive:是否对子孙全部检索,默认为
  • Truestring:用与在信息文本中特定字符串的检索

6.1 name参数

如果是指定的字符串:会查找与字符串完全匹配的内容,如下

a_list = bs.find_all("a")
print(a_list)		# 将会返回所有包含a标签的内容

如果是使用正则表达式:将会使用BeautifulSoup4中的search()方法来匹配内容,如下

from bs4 import BeautifulSoup
import re

html = 'https://www.baidu.com'
bs = BeautifulSoup(html,"html.parser")
t_list = bs.find_all(re.compile("a"))
for item in t_list:
 	print(item)		# 输出列表

如果传入一个列表:BeautifulSoup4将会与列表中的任一元素匹配到的节点返回,如下

t_list = bs.find_all(["meta","link"])
for item in t_list:
	print(item)

如果传入一个函数或者方法:将会根据函数或者方法来匹配

from bs4 import BeautifulSoup

html = 'https://www.baidu.com'
bs = BeautifulSoup(html,"html.parser")
def name_is_exists(tag):
 	 return tag.has_attr("name")
t_list = bs.find_all(name_is_exists)
for item in t_list:
 	 print(item)

6.2 attrs参数

并不是所有的属性都可以使用上面这种方式进行搜索,比如HTML的data属性,用于指定属性搜索

t_list = bs.find_all(data-foo="value")

6.3 string参数

通过通过string参数可以搜索文档中的字符串内容,与name参数的可选值一样,string参数接受字符串,正则表达式,列表

from bs4 import BeautifulSoup
import re

html = 'https://www.baidu.com'
bs = BeautifulSoup(html, "html.parser")
t_list = bs.find_all(attrs={"data-foo": "value"})
for item in t_list:
 	print(item)
t_list = bs.find_all(text="hao123")
for item in t_list:
 	print(item)
t_list = bs.find_all(text=["hao123", "地图", "贴吧"])
for item in t_list:
 	print(item)
t_list = bs.find_all(text=re.compile("\d"))
for item in t_list:
 	print(item)

使用find_all()方法的时,常用到正则表达式的形式import re如下所示

soup.find_all(sring = re.compile('pyhton'))		# 指定查找内容

# 或者指定使用正则表达式要搜索的内容
sring = re.compile('pyhton')		# 字符为python
soup.find_all(string)				# 调用方法模板

6.4 常用的fiid()方法如下

python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)

7. 总结参考

此文列举了BeautifulSoup库在爬虫中的基本使用,不正确之处望指教,参考

到此这篇关于python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)的文章就介绍到这了,更多相关python爬虫beautifulsoup库内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中的迭代器漫谈
Feb 03 Python
Python3读取UTF-8文件及统计文件行数的方法
May 22 Python
用Python设计一个经典小游戏
May 15 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
Jul 11 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
Mar 13 Python
解决Python运行文件出现out of memory框的问题
Dec 03 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
Jun 24 Python
Python生态圈图像格式转换问题(推荐)
Dec 02 Python
TensorFlow 显存使用机制详解
Feb 03 Python
将python文件打包exe独立运行程序方法详解
Feb 12 Python
Python内置函数locals和globals对比
Apr 28 Python
Python中的变量与常量
Nov 11 Python
python绘制高斯曲线
Feb 19 #Python
Python绘制数码晶体管日期
Feb 19 #Python
Python Pygame实现俄罗斯方块
Feb 19 #Python
python实现图片转字符画
Feb 19 #Python
python读取图片颜色值并生成excel像素画的方法实例
Feb 19 #Python
python 基于DDT实现数据驱动测试
Feb 18 #Python
详解解决jupyter不能使用pytorch的问题
Feb 18 #Python
You might like
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
ThinkPHP中html:list标签用法分析
2016/01/09 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
Jquery实现视频播放页面的关灯开灯效果
2013/05/27 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
21个JavaScript事件(Events)属性汇总
2014/12/02 Javascript
JavaScript进阶练习及简单实例分析
2016/06/03 Javascript
基于JS代码实现实时显示系统时间
2016/06/16 Javascript
vue2.0开发实践总结之入门篇
2016/12/06 Javascript
任意Json转成无序列表的方法示例
2016/12/09 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
详解nodejs中的process进程
2017/03/19 NodeJs
vue.js语法及常用指令
2017/10/29 Javascript
微信小程序slider组件使用详解
2018/01/31 Javascript
babel7.x和webpack4.x配置vue项目的方法步骤
2019/05/12 Javascript
JS通过ajax + 多列布局 + 自动加载实现瀑布流效果
2019/05/30 Javascript
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
在Python的Flask框架中验证注册用户的Email的方法
2015/09/02 Python
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
Python实现的多叉树寻找最短路径算法示例
2018/07/30 Python
对python中的乘法dot和对应分量相乘multiply详解
2018/11/14 Python
django 类视图的使用方法详解
2019/07/24 Python
python小白切忌乱用表达式
2020/05/29 Python
Html5移动端获奖无缝滚动动画实现示例
2018/06/25 HTML / CSS
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
软件测试工程师结构化面试题库
2016/11/23 面试题
临床医师专业个人自我评价
2014/01/08 职场文书
毕业生自荐书
2014/02/02 职场文书
网络工程师职业规划
2014/02/10 职场文书
3分钟演讲稿
2014/04/30 职场文书
数字化校园建设方案
2014/05/03 职场文书
2016新年慰问信范文
2015/03/25 职场文书