python使用BeautifulSoup 解析HTML


Posted in Python onApril 24, 2022

一、安装

  • Bautiful Soup 是第三方库,因此需要单独下载,下载方式非常简单
  • 由于 BS4 解析页面时需要依赖文档解析器,所以还需要安装 lxml 作为解析库
  • Python 也自带了一个文档解析库 html.parser, 但是其解析速度要稍慢于 lxml
pip install bs4
pip install lxml
pip install html5lib

二、html.parser解析

  • html.parser 表示解析文档时所用的解析器
  • 解析器也可以是 lxml 或者 html5lib
html = '''
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">&times;</button>
<h4 class="modal-title">Modal title</h4>
</div>
<div class="modal-body">
...
</div>
<div class="modal-footer">
<a href="#" rel="external nofollow"  rel="external nofollow"  class="btn btn-default" data-dismiss="modal">Close</a>
<a href="#" rel="external nofollow"  rel="external nofollow"  class="btn btn-primary">Save</a>
</div>
</div>
</div>
'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'html.parser')
#prettify()用于格式化输出html/xml文档
print(soup.prettify())

三、外部文档解析

  • 外部文档,您也可以通过 open 的方式打开读取
from bs4 import BeautifulSoup

fp = open('html_doc.html', encoding='utf8')
soup = BeautifulSoup(fp, 'lxml')

四、标签选择器

  • 标签(Tag)是组成 HTML 文档的基本元素
  • 通过标签名和标签属性可以提取出想要的内容
from bs4 import BeautifulSoup

soup = BeautifulSoup('<p class="name nickname user"><b>i am autofelix</b></p>', 'html.parser')

#获取整个p标签的html代码
print(soup.p)
#获取b标签
print(soup.p.b)
#获取p标签内容,使用NavigableString类中的string、text、get_text()
print(soup.p.text)
#返回一个字典,里面是多有属性和值
print(soup.p.attrs)
#查看返回的数据类型
print(type(soup.p))
#根据属性,获取标签的属性值,返回值为列表
print(soup.p['class'])
#给class属性赋值,此时属性值由列表转换为字符串
soup.p['class']=['Web','Site']
print(soup.p)

五、css选择器

  • 支持大部分的 CSS 选择器,比如常见的标签选择器、类选择器、id 选择器,以及层级选择器
  • 通过向 select 方法中添加选择器,就可以在 HTML 文档中搜索到与之对应的内容
html = """
<html>
<head>
<title>零基础学编程</title>
</head>
<body>
<p class="intro"><b>i am autofelix</b></p>
<p class="nickname">飞兔小哥</p>
<a href="https://autofelix.blog.csdn.net" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="csdn">csdn主页</a>
<a href="https://xie.infoq.cn/u/autofelix/publish" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="infoq">infoq主页</a>
<a href="https://blog.51cto.com/autofelix" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="51cto">51cto主页</a>
<p class="attention">跪求关注 一键三连</p>
<p class="introduce">
<a href="https://www.cnblogs.com/autofelix" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="cnblogs">博客园主页</a>
</p>
</body>
</html>
"""

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'html.parser')
#根据元素标签查找
print(soup.select('nickname'))
#根据属性选择器查找
print(soup.select('a[href]'))
#根据类查找
print(soup.select('.attention'))
#后代节点查找
print(soup.select('html head title'))
#查找兄弟节点
print(soup.select('p + a'))
#根据id选择p标签的兄弟节点
print(soup.select('p ~ #csdn'))
#nth-of-type(n)选择器,用于匹配同类型中的第n个同级兄弟元素
print(soup.select('p ~ a:nth-of-type(1)'))
#查找子节点
print(soup.select('p > a'))
print(soup.select('.introduce > #cnblogs'))

六、节点遍历

  • 可以使用 contents、children 用来遍历子节点
  • 可以使用 parent 与 parents 用来遍历父节点
  • 可以使用 next_sibling 与 previous_sibling 用来遍历兄弟节点 
html = """
<html>
<head>
<title>零基础学编程</title>
</head>
<body>
<p class="intro"><b>i am autofelix</b></p>
<p class="nickname">飞兔小哥</p>
<a href="https://autofelix.blog.csdn.net" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="csdn">csdn主页</a>
<a href="https://xie.infoq.cn/u/autofelix/publish" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="infoq">infoq主页</a>
<a href="https://blog.51cto.com/autofelix" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="51cto">51cto主页</a>
<p class="attention">跪求关注 一键三连</p>
<p class="introduce">
<a href="https://www.cnblogs.com/autofelix" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="cnblogs">博客园主页</a>
</p>
</body>
</html>
"""

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'html.parser')
body_tag=soup.body
print(body_tag)

# 以列表的形式输出,所有子节点
print(body_tag.contents)

# children 用来遍历子节点
for child in body_tag.children:
print(child)

七、find_all方法

  • 是解析 HTML 文档的常用方法
  • find_all() 方法用来搜索当前 tag 的所有子节点
  • 并判断这些节点是否符合过滤条件
  • 最后以列表形式将符合条件的内容返回
html = """
<html>
<head>
<title>零基础学编程</title>
</head>
<body>
<p class="intro"><b>i am autofelix</b></p>
<p class="nickname">飞兔小哥</p>
<a href="https://autofelix.blog.csdn.net" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="csdn">csdn主页</a>
<a href="https://xie.infoq.cn/u/autofelix/publish" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="infoq">infoq主页</a>
<a href="https://blog.51cto.com/autofelix" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="51cto">51cto主页</a>
<p class="attention">跪求关注 一键三连</p>
<p class="introduce">
<a href="https://www.cnblogs.com/autofelix" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="cnblogs">博客园主页</a>
</p>
</body>
</html>
"""

import re
from bs4 import BeautifulSoup

# 创建soup解析对象
soup = BeautifulSoup(html, 'html.parser')
# 查找所有a标签并返回
print(soup.find_all("a"))
# 查找前两条a标签并返回,只返回两条a标签
print(soup.find_all("a",limit=2))
# 按照标签属性以及属性值查找
print(soup.find_all("p",class_="nickname"))
print(soup.find_all(id="infoq"))
# 列表行书查找tag标签
print(soup.find_all(['b','a']))
# 正则表达式匹配id属性值
print(soup.find_all('a',id=re.compile(r'.\d')))
print(soup.find_all(id=True))
# True可以匹配任何值,下面代码会查找所有tag,并返回相应的tag名称
for tag in soup.find_all(True):
print(tag.name,end=" ")
# 输出所有以b开始的tag标签
for tag in soup.find_all(re.compile("^b")):
print(tag.name)
# 简化前写法
soup.find_all("a")
# 简化后写法
soup("a")

八、find方法

html = """
<html>
<head>
  <title>零基础学编程</title>
</head>
<body>
  <p class="intro"><b>i am autofelix</b></p>
  <p class="nickname">飞兔小哥</p>
  <a href="https://autofelix.blog.csdn.net" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="csdn">csdn主页</a>
  <a href="https://xie.infoq.cn/u/autofelix/publish" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="infoq">infoq主页</a>
  <a href="https://blog.51cto.com/autofelix" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="51cto">51cto主页</a>
  <p class="attention">跪求关注 一键三连</p>
  <p class="introduce">
    <a href="https://www.cnblogs.com/autofelix" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  id="cnblogs">博客园主页</a>
  </p>
</body>
</html>
"""

import re
from bs4 import BeautifulSoup

# 创建soup解析对象
soup = BeautifulSoup(html, 'html.parser')
# 查找第一个a并直接返回结果
print(soup.find('a'))
# 查找title
print(soup.find('intro'))
# 匹配指定href属性的a标签
print(soup.find('a',href='https://autofelix.blog.csdn.net'))
# 根据属性值正则匹配
print(soup.find(class_=re.compile('tro')))
# attrs参数值
print(soup.find(attrs={'class': 'introduce'}))
# 使用 find 时,如果没有找到查询标签会返回 None,而 find_all 方法返回空列表
print(soup.find('aa'))
print(soup.find_all('bb'))
# 简化写法
print(soup.head.title)
# 上面代码等价于
print(soup.find("head").find("title"))

到此这篇关于python 中的 BeautifulSoup 网页解析的文章就介绍到这了!


Tags in this post...

Python 相关文章推荐
用Python的Django框架完成视频处理任务的教程
Apr 02 Python
python threading模块操作多线程介绍
Apr 08 Python
python中解析json格式文件的方法示例
May 03 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
Jun 12 Python
Python爬豆瓣电影实例
Feb 23 Python
numpy中实现二维数组按照某列、某行排序的方法
Apr 04 Python
Python这样操作能存储100多万行的xlsx文件
Apr 16 Python
Python环境Pillow( PIL )图像处理工具使用解析
Sep 12 Python
Django实现whoosh搜索引擎使用jieba分词
Apr 08 Python
Python可视化学习之seaborn调色盘
Feb 24 Python
Python中第三方库Faker的使用详解
Apr 02 Python
baselines示例程序train_cartpole.py的ImportError
May 20 Python
Python中npy和mat文件的保存与读取
Apr 24 #Python
python小型的音频操作库mp3Play
Apr 24 #Python
5个pandas调用函数的方法让数据处理更加灵活自如
Apr 24 #Python
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
Apr 24 #Python
在 Python 中利用 Pool 进行多线程
Apr 24 #Python
Python何绘制带有背景色块的折线图
python中Pyqt5使用Qlabel标签播放视频
Apr 22 #Python
You might like
php强制更新图片缓存的方法
2015/02/11 PHP
php die()与exit()的区别实例详解
2016/12/03 PHP
tp5修改(实现即点即改)
2019/10/18 PHP
PHP实现简单注册登录系统
2020/12/28 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
跟着Jquery API学Jquery之一 选择器
2010/04/07 Javascript
纯JS实现的批量图片预览加载功能
2011/08/14 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
扒一扒JavaScript 预解释
2015/01/28 Javascript
关于jQuery.ajax()的jsonp碰上post详解
2017/07/02 jQuery
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
vue-cli之router基本使用方法详解
2017/10/17 Javascript
JS实现网页抢购功能(触发,终止脚本)
2017/11/27 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
回顾Javascript React基础
2019/06/15 Javascript
实现vuex原理的示例
2020/10/21 Javascript
详解Python读取配置文件模块ConfigParser
2017/05/11 Python
利用python修改json文件的value方法
2018/12/31 Python
python3.7添加dlib模块的方法
2020/07/01 Python
使用phonegap播放音频的实现方法
2017/03/31 HTML / CSS
英国轻奢珠宝品牌:Astley Clarke
2016/12/18 全球购物
英国第一职业高尔夫商店:Clickgolf.co.uk
2020/11/18 全球购物
编程实现去掉XML的重复结点
2014/05/28 面试题
解释一下ruby中的特殊方法与特殊类
2013/02/26 面试题
咖啡蛋糕店创业计划书
2014/01/28 职场文书
学校师德承诺书
2014/05/23 职场文书
创建文明城市标语
2014/06/16 职场文书
保密工作承诺书
2014/08/29 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
1000字打架检讨书
2014/11/03 职场文书
2014年团工作总结
2014/11/27 职场文书
单位租房协议书范本
2014/12/04 职场文书
毕业班班主任工作总结2015
2015/07/23 职场文书
Javascript中的解构赋值语法详解
2021/04/02 Javascript
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA