如何用Python Beautiful Soup解析HTML内容
作者:naer_chongya 发布时间:2021-04-24 10:20:00
Beautiful Soup是一种Python的解析库,主要用于解析和处理HTML/XML内容。它是基于Python的标准库和第三方库的结合,能够提供简便的方式实现文本的查找、修改和提取操作。
HTML指的是超文本标记语言(Hypertext Markup Language),即一种用于描述网页内容的标记语言。在我们访问一个网页的时候,浏览器便会将HTML内容下载到本地并以可视化的形式展示给我们。但是,在程序员的世界里我们需要能够对HTML内容进行更多的操作,而Beautiful Soup就是这种工具之一。
Beautiful Soup能够解析HTML内容并转化成一个复杂的树结构,然后可以通过标签名、属性名等多种方式进行内容的查找和修改。使用Beautiful Soup不仅能够让我们更高效地处理HTML内容,而且还能避免很多手动操作引起的误差。
下面我们来详细介绍Beautiful Soup的使用方式和应用场景。
Beautiful Soup的使用
Beautiful Soup提供的解析器有bs3、bs4,其中bs3逐渐被弃用,目前bs4为最新版。我们主要介绍bs4的使用。
首先,我们需要安装Beautiful Soup库。在终端输入以下命令:
pip install beautifulsoup4
安装成功后,我们通过import语句将Beautiful Soup库引入程序中。
from bs4 import BeautifulSoup
接下来假设我们有一个HTML文本:
<html>
<head>
<title>Beautiful Soup Tutorial</title>
</head>
<body>
<div class="article">
<h1>Python BeautifulSoup Tutorial</h1>
<p class="intro">这是一篇Beautiful Soup入门教程</p>
<p class="content">它将介绍Beautiful Soup的基本用法以及一些高级的应用场景</p>
<a class="link" href="http://www.example.com">点击访问示例网站</a>
</div>
</body>
</html>
我们可以通过以下语句将HTML文本解析成BeautifulSoup对象:
soup = BeautifulSoup(html_doc, 'html.parser')
其中,html_doc为上述HTML文本,'html.parser’为指定的解析器。
标签选择器
Beautiful Soup提供了多种标签选择器,能够便捷地从HTML文本中选择需要的内容。
选择标签名为h1的元素:
soup.select('h1')
结果为:
[<h1>Python BeautifulSoup Tutorial</h1>]
选择标签名为p且class属性为“intro”的元素:
soup.select('p.intro')
结果为:
[<p class="intro">这是一篇Beautiful Soup入门教程</p>]
选择标签名为a且class属性为“link”的元素,其href属性的值为"http://www.example.com":
soup.select('a.link[href="http://www.example.com"]')
结果为:
[<a class="link" href="http://www.example.com">点击访问示例网站</a>]
标签树操作
我们可以通过Beautiful Soup的树型结构,对HTML文本进行各种查找与修改操作。
嵌套选择标签
可以通过嵌套选择标签,定位到HTML文本中需要的标签,例如选择“div”标签下的所有“p”标签。
content = soup.select('div.article > p')
可以看到,选择结果为两个“p”标签。
[<p class="intro">这是一篇Beautiful Soup入门教程</p>,
<p class="content">它将介绍Beautiful Soup的基本用法以及一些高级的应用场景</p>]
.string/.text属性获取标签内容
可以通过.string属性或.text属性获取标签内的文本内容。
例如,获取标题“h1”标签内的文本内容:
title = soup.select('h1')[0].string
print(title)
输出结果为:
Python BeautifulSoup Tutorial
可以看到,.string相比于.text属性更加精确,可以避免获取到标签内的其他内容干扰。
.get()方法获取标签属性值
可以通过.get()方法获取标签内的属性值。例如,获取“a”标签的href属性值:
link = soup.select('a.link')[0].get('href')
print(link)
输出结果为:
http://www.example.com
修改HTML文本
除了查找与获取HTML文本的内容,我们还可以使用Beautiful Soup对HTML文本进行修改操作。
修改标签属性值
通过tag对象的.attrs属性可以获取标签的属性,使用该属性进行修改操作。
例如,将“a”标签的href属性值修改为“http://www.newexample.com”:
link_tag = soup.select('a.link')[0]
link_tag['href'] = 'http://www.newexample.com'
print(link_tag)
可以看到,输出结果中href属性值已经被修改。
<a class = "link" href = "http://www.newexample.com">点击访问示例网站</a>
修改标签文本内容
通过tag对象的.string属性或replace_with()方法可以修改标签的文本内容。
例如,将第一个“p”标签的文本修改为“欢迎来到Beautiful Soup教程”:
p_tag = soup.select('p.intro')[0]
p_tag.string = '欢迎来到Beautiful Soup教程'
print(p_tag)
输出结果为:
<p class = "intro">欢迎来到Beautiful Soup教程</p>
增加标签和删除标签
我们可以使用Beautiful Soup提供的函数,例如new_tag()、new_string()、append()和insert()等方法,创建新标签或文本,并插入HTML文本当中。
例如,我们通过append()方法在“body”标签的末尾增加一个“div”标签:
new_div = soup.new_tag('div')
new_div.string = '这是Beautiful Soup教程的结尾'
soup.select('body')[0].append(new_div)
print(soup)
可以看到,输出结果中的HTML文本结尾增加了一个新的“div”标签。
应用场景
美食网站信息爬取
我们将以美食网站中的“热门排行榜”为例进行演示。
首先,我们需要通过requests库获取HTML文本。以“热门排行榜”页面为例:
import requests
from bs4 import BeautifulSoup
url = 'https://www.meishij.net/chufang/diy/diy_rmphb/'
html = requests.get(url)
soup = BeautifulSoup(html.text, 'html.parser')
我们可以通过观察HTML文本,发现热门排行榜的信息在“div”标签中,具体位置在“div.zg_wrap”标签中,而餐品名称在“div.zg_wrap > li > div > p > a”标签中。因此,我们可以使用以下语句提取美食名称:
for i, li in enumerate(soup.select('div.zg_wrap > li')):
name = li.select('div > p > a')[0].get('title')
print(f'{i+1}. {name}')
可以看到,我们已成功提取出了美食名称,输出结果如下:
1. 汉堡
2. 糯米饭
3. 明炉烤鸭
4. 龙虾
5. 火锅
6. 美式薯条
7. 叉烧肉
8. 红烧肉
9. 快手美食
10. 韩国泡菜
至此,我们已经成功通过Beautiful Soup解析库,提取出了美食网站的热门排行榜信息,演示了Beautiful Soup在爬虫数据抓取和处理中的重要应用。
来源:https://blog.csdn.net/naer_chongya/article/details/130672205
猜你喜欢
- 背景Python 作为一门成熟的编程语言,拥有无数优秀的第三方包以方便开发者能够快速地构建应用。一般来说,如果你开发了一个 Python 软
- 计算机为数组分配一段连续的内存,从而支持对数组随机访问;由于项的地址在编号上是连续的,数组某一项的地址可以通过将两个值相加得出,即将数组的基
- 上周用了一周的时间学习了Python和Scrapy,实现了从0到1完整的网页爬虫实现。研究的时候很痛苦,但是很享受,做技术的嘛。首先,安装P
- 因工作需要,最近在学习使用python来解析各种文件,包括xmind,xml,excel,csv等等。在学习python解析XML的时候看到
- 程序设计中三种基本机构是顺序结构、选择结构和循环结构。顺序结构语句是程序中最基础的语句,赋值语句、输入/输出语句、模块导入语句等都是顺序结构
- 实现效果如下: 需求:由于后台搜索选项有很多,影响页面美观,所以一进来要隐藏一部分搜索项,只保留1行,点击【展开搜索】按钮的时候才
- //创建成绩表 create table result( stu_
- 为了防止再次被攻击,做个验证码过滤程序是必要的。我在网上找了一些资料,觉得用别人做好的代码总是很不爽,自己做麻又不会写复杂的代码,特别是生成
- Vuejs 本身就是一个 MVVM 的框架。但是在监听 window 上的 事件 时,往往会显得 力不从心。比如 这次是 window.re
- 开发中经常会使用npm install 安装依赖包,经常会看到^符号和~符号,现将二者的区别总结如下:版本号 x.y.z : z
- 备忘一下python中的字典如何遍历,没有什么太多技术含量.仅供作为初学者的我参考.#!/usr/bin/env python# codin
- 最近写一个爬虫系统,需要用到python的日志记录模块,于是便学习了一下。python的标准库里的日志系统从Python2.3开始支持。只要
- 下表列出了 Microsoft ACCESS 的命令行选项:选项 效果database 打开指定的 Microsoft Access 数据库
- 最近在抓取http://skell.sketchengine.eu网页时,发现用requests无法获得网页的全部内容,所以我就用selen
- TensorFlow训练网络有两种方式,一种是基于tensor(array),另外一种是迭代器两种方式区别是:第一种是要加载全部数据形成一个
- 继团队的CSS3.0中文手册在国内首发以后,最近风风火火的到处吹起HTML5.0和CSS3.0的春风;似乎在这浏览器互相调侃的年代,成就了一
- 本文实例讲述了python实现线程池的方法。分享给大家供大家参考。具体如下:原理:建立一个任务队列,然多个线程都从这个任务队列中取出任务然后
- 本文实例讲述了php将textarea数据提交到mysql出现很多空格的解决方法。分享给大家供大家参考。具体分析如下:有一些朋友可能会发现我
- 1.字符串转二进制数组 string content="这是做个测试!"; System.Text.UnicodeEnc
- python封装简介1.效果图:对比一:对比二:2.学习来源代码:# 封装是面向对象的三大特性之一# 封装指的是隐藏对象中一些不希望被外部所