网页文本解析利器“美丽汤”

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 网页被抓取下来,通常就是str 字符串类型的对象,要从里面寻找信息,最直接的想法就是直接通过字符串的 find 方法和切片操作:

入门教程、案例源码、学习资料、读者群

请访问: python666.cn

大家好,欢迎来到 Crossin的编程教室 !

关于爬虫的案例和方法,我们已讲过许多。不过在以往的文章中,大多是关注在如何把网页上的内容抓取下来。今天我们来分享下,当你已经把内容爬下来之后,如何提取出其中你需要的具体信息

网页被抓取下来,通常就是str 字符串类型的对象,要从里面寻找信息,最直接的想法就是直接通过字符串的find 方法切片操作


s = '<p>价格:15.7 元</p>'
start = s.find('价格:')
end = s.find(' 元')
print(s[start+3:end])  
# 15.7

这能应付一些极简单的情况,但只要稍稍复杂一点,这么写就会累死人。更通用的做法是使用正则表达式


import re
s = '<p>价格:15.7 元</p>'
r = re.search('[\d.]+', s)
print(r.group())
# 15.7


正则表达式是处理文本解析的万金油,什么情况都可以应对。但可惜掌握它需要一定的学习成本,原本我们有一个网页提取的问题,用了正则表达式,现在我们有了两个问题。


HTML 文档本身是结构化的文本,有一定的规则,通过它的结构可以简化信息提取。于是,就有了lxml、pyquery、BeautifulSoup等网页信息提取库。一般我们会用这些库来提取网页信息。其中,lxml 有很高的解析效率,支持 xPath 语法(一种可以在 HTML 中查找信息的规则语法);pyquery 得名于 jQuery(知名的前端 js 库),可以用类似 jQuery 的语法解析网页。但我们今天要说的,是剩下的这个:BeautifulSoup

BeautifulSoup(下文简称 bs)翻译成中文就是“美丽的汤”,这个奇特的名字来源于《爱丽丝梦游仙境》(这也是为何在其官网会配上奇怪的插图,以及用《爱丽丝》的片段作为测试文本)。



bs 最大的特点我觉得是简单易用,不像正则和 xPath 需要刻意去记住很多特定语法,尽管那样会效率更高更直接。对大多数 python 使用者来说,好用会比高效更重要。这也是我自己使用并推荐 bs 的主要原因。

接下来介绍点 bs 的基本方法,让你看完就能用起来。考虑到“只收藏不看党”的阅读体验,先给出一个“嫌长不看版”的总结:


  1. anaconda附带,也可以通过pip安装
  2. 指定不同解析器在性能、容错性上会有差异,导致结果也可能不一样
  3. 基本使用流程:通过文本初始化 bs 对象->通过 find/find_all 或其他方法检测信息->输出或保存
  4. 可以迭代式的查找,比如先定位出一段内容,再其上继续检索
  5. 开发时应注意不同方法的返回类型,出错时多看报错、多加输出信息
  6. 官方文档很友好,也有中文,推荐阅读


安装


推荐使用pip进行安装(关于 pip 见旧文如何安装 Python 的第三方模块):

pip install beautifulsoup4


要注意,包名是beautifulsoup4,如果不加上 4,会是老版本也就是 bs3,它是为了兼容性而存在,目前已不推荐。我们这里说 bs,都是指 bs4。

bs4 也可以直接通过安装 anaconda 获得(介绍见旧文 我也曾经因安装库而抓狂,直到我遇到了anaconda )。

bs 在使用时需要指定一个“解析器”:


  • html.parse- python 自带,但容错性不够高,对于一些写得不太规范的网页会丢失部分内容
  • lxml- 解析速度快,需额外安装
  • xml- 同属 lxml 库,支持 XML 文档
  • html5lib- 最好的容错性,但速度稍慢

这里的 lxml 和 html5lib 都需要额外安装,不过如果你用的是 anaconda,都是一并安装好的。

快速上手


我们就用官网上的文档作例子:


html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""


使用 bs 的初始化操作,是用文本创建一个 BeautifulSoup 对象,建议手动指定解析器:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')


获取其中的某个结构化元素及其属性:


soup.title  # title 元素
# <title>The Dormouse's story</title>
soup.p  # 第一个 p 元素
# <p class="title"><b>The Dormouse's story</b></p>
soup.p['class']  # p 元素的 class 属性
# ['title']
soup.p.b  # p 元素下的 b 元素
# <b>The Dormouse's story</b>
soup.p.parent.name  # p 元素的父节点的标签
# body


并不是所有信息都可以简单地通过结构化获取,通常使用 find 和 find_all 方法进行查找:


soup.find_all('a')  # 所有 a 元素
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
soup.find(id='link3')  # id 为 link3 的元素
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a


  • find 和 find_all 可以有多个搜索条件叠加,比如find('a', id='link3', class_='sister')
  • find 返回的是一个bs4.element.Tag 对象,这个对象可以进一步进行搜索。如果有多个满足的结果,find只返回第一个;如果没有,返回 None。
  • find_all 返回的是一个由 bs4.element.Tag 对象组成的 list,不管找到几个或是没找到,都是 list。

输出:


x = soup.find(class_='story')
x.get_text()  # 仅可见文本内容
# 'Once upon a time there were three little sisters; and their names were\nElsie,\nLacie and\nTillie;\nand they lived at the bottom of a well.'
x.prettify()  # 元素完整内容
# '<p class="story">\n Once upon a time there were three little sisters; and their names were\n <a class="sister" href="http://example.com/elsie" id="link1">\n  Elsie\n </a>\n ,\n <a class="sister" href="http://example.com/lacie" id="link2">\n  Lacie\n </a>\n and\n <a class="sister" href="http://example.com/tillie" id="link3">\n  Tillie\n </a>\n ;\nand they lived at the bottom of a well.\n</p>\n'


如果你有前端开发经验,对 CSS 选择器很熟悉,bs 也为你提供了相应的方法:


soup.select('html head title')
# [<title>The Dormouse's story</title>]
soup.select('p > #link1')
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]

以上就是 BeautifulSoup 的一个极简上手介绍,对于 bs 能做什么,想必你已有了一个初步认识。如果你要在开发中使用,建议再看下它的官方文档。文档写得很清楚,也有中文版,你只要看了最初的一小部分,就可以在代码中派上用场了。更多的细节可以在使用时进一步搜索具体方法和参数设置。

中文版地址:

https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

(复制到浏览器中打开)

对于爬虫的其他方面,推荐阅读我们之前的相关文章:

感谢转发点赞的各位~


=_往期文章推荐_


如何调教一个定制化的ChatGPT私人助理,接入自家知识库

相关文章
|
4月前
|
数据挖掘 Shell 测试技术
怎么用Python解析HTML轻松搞定网页数据
**Python解析HTML摘要** 本文介绍了使用Python处理HTML的常见需求,如数据提取、网络爬虫和分析,并讨论了三种解析方法。正则表达式适用于简单匹配,但对复杂HTML不理想;BeautifulSoup提供简单API,适合多数情况;lxml结合XPath,适合处理大型复杂文档。示例展示了如何用这些方法提取链接。
102 2
|
18天前
|
XML JavaScript 前端开发
如何解析一个 HTML 文本
【10月更文挑战第23天】在实际应用中,根据具体的需求和场景,我们可以灵活选择解析方法,并结合其他相关技术来实现高效、准确的 HTML 解析。随着网页技术的不断发展,解析 HTML 文本的方法也在不断更新和完善,
|
2月前
|
机器学习/深度学习 人工智能 编解码
深入探索AI文生语音技术的奥秘:从文本输入到逼真语音输出的全链条语音合成过程解析
【9月更文挑战第2天】深入探索AI文生语音技术的奥秘:从文本输入到逼真语音输出的全链条语音合成过程解析
 深入探索AI文生语音技术的奥秘:从文本输入到逼真语音输出的全链条语音合成过程解析
|
6月前
|
消息中间件 前端开发 JavaScript
第七篇 提升网页性能:深入解析HTTP请求优化策略(二)
第七篇 提升网页性能:深入解析HTTP请求优化策略(二)
195 1
|
1月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
216 0
|
6月前
|
Web App开发 存储 缓存
第八篇 提升网页性能:深入解析HTTP请求优化策略(三)
第八篇 提升网页性能:深入解析HTTP请求优化策略(三)
171 0
|
3月前
|
编译器 PHP 开发者
PHP 7新特性深度解析与实践深入浅出PHP:构建你的第一个动态网页
【8月更文挑战第27天】本文将深入探讨PHP 7的新特性,包括性能提升、语法改进等,并通过代码示例展示如何在实际项目中应用这些新特性。同时,我们还将讨论如何优化现有项目以充分利用PHP 7的优势。让我们一起探索PHP 7的世界,提升开发效率和项目质量!
|
3月前
|
前端开发 搜索推荐 JavaScript
掌握网页开发利器:深入解析ID选择器,轻松定制个性化网页!
掌握网页开发利器:深入解析ID选择器,轻松定制个性化网页!
|
3月前
|
数据采集 JavaScript 前端开发
Python 爬虫实战:抓取和解析网页数据
【8月更文挑战第31天】本文将引导你通过Python编写一个简单的网络爬虫,从网页中抓取并解析数据。我们将使用requests库获取网页内容,然后利用BeautifulSoup进行解析。通过本教程,你不仅能够学习到如何自动化地从网站收集信息,还能理解数据处理的基本概念。无论你是编程新手还是希望扩展你的技术工具箱,这篇文章都将为你提供有价值的见解。
|
3月前
|
机器学习/深度学习 数据采集 自然语言处理
Python中实现简单的文本情感分析未来触手可及:新技术趋势与应用深度解析
【8月更文挑战第30天】在数字化的今天,理解和分析用户生成的内容对许多行业至关重要。本文将引导读者通过Python编程语言,使用自然语言处理(NLP)技术,构建一个简单的文本情感分析工具。我们将探索如何利用机器学习模型来识别和分类文本数据中的情感倾向,从而为数据分析和决策提供支持。文章将涵盖从数据预处理到模型训练和评估的全过程,旨在为初学者提供一个易于理解且实用的入门指南。

推荐镜像

更多