python爬虫基础html内容解析库BeautifulSoup

我们通过Requests请求url获取数据,请求把数据返回来之后就要提取目标数据,不同的网站返回的内容通常有多种不同的格式,一种是 json 格式,我们可以直接通过json.loads转换python的json对象处理。另一种 XML 格式的,还有一种最常见格式的是 HTML 文档,今天就来讲讲如何从 HTML 中提取出感兴趣的数据。

BeautifulSoup 是一个用于解析 HTML 文档的 Python 库,通过 BeautifulSoup,你只需要用很少的代码就可以提取出 HTML 中任何感兴趣的内容,此外,它还有一定的 HTML 容错能力,对于一个格式不完整的HTML 文档,它也可以正确处理。

安装 beautifulsoup

pip install beautifulsoup4

初始化对象时可以直接传递字符串或者文件句柄

soup = BeautifulSoup(open("index.html"))
soup = BeautifulSoup("<html>data</html>")

支持多种解析接口

# python内置HTML解析
BeautifulSoup(markup, "html.parser")
# lxml语言支持HTML解析
BeautifulSoup(markup, "lxml")
# 解析XML引擎
BeautifulSoup(markup, "xml")
# 解析HTML5引擎
BeautifulSoup(markup, "html5lib")

自动添加和补全标签

下面是一段不规范的html,缺少闭合标签

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>
"""
  • 它由很多标签(Tag)组成,比如 html、head、title等等都是标签
  • 一个标签对构成一个节点,比如 …是一个根节点
  • 节点之间存在某种关系,比如p之间互为邻居,他们是相邻的兄弟(sibling)节点
  • p 是 body 的直接子(children)节点,还是 html 的子孙(descendants)节点
  • body 是 p 的父(parent)节点,html 是 p 的祖辈(parents)节点
  • 嵌套在标签之间的字符串是该节点下的一个特殊子节点,比如title文本内容“The Dormouse’sstory”也是一个节点,只不过没名字。

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

prettify()标准缩进格式的输出。输出内容如下:

 <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 class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>and<a class="sister" href="http://example.com/tillie" id="link2">Tillie</a>; and they lived at the bottom of a well.</p><p class="story">...</p></body></html>

bs4获取标签及内容示例


# title标签
soup.title
# <title>The Dormouse's story</title># title标签名称
soup.title.name
# 'title'# # title标签的文本字符内容
soup.title.string
# 'The Dormouse's story'# title标签父节点名称
soup.title.parent.name
# 'head'# 从前向后找到html孙节点第一个p节点
soup.p
# <p class="title"><b>The Dormouse's story</b></p># p节点的class属性
soup.p['class']
# ['title']# 进栈出栈的方式找到第一个a标签
soup.a
# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a># p节点的href属性
soup.a["href"]
# 'http://example.com/elsie'soup.find_all('a')
# 同上
soup.find_all("p")[1].find_all("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")
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

遍历文档树

从根节点 html 标签开始遍历,元素进栈出栈,直到找到目标元素为止。

BeatifulSoup 将 HTML 抽象成为 4 类主要的数据类型:

  • Tag:每个标签节点就是一个Tag对象
  • NavigableString:包裹在Tag对象里的文本字符串
  • BeautifulSoup 对象代表要解析的整个
  • Comment注释对象

type(soup)
# <class 'bs4.BeautifulSoup'>
type(soup.p)
# <class 'bs4.element.Tag'>
# type(soup.p.string)
<class 'bs4.element.NavigableString'>

Tag标签

每个 Tag 都有一个名字,它对应 HTML 的标签名称。

soup.p.name
# 'p'

标签有属性,属性的访问方式和字典是类似的,它返回一个列表对象或字符串。

soup.p['class']
# ['title']soup.a['href']
# 'http://example.com/elsie'

NavigableString
获取标签中的内容,直接使用 .stirng 即可获取,它是一个 NavigableString 对象 。

soup.p.string
# "The Dormouse's story"
type(soup.p.string)
bs4.element.NavigableString

搜索文档树

搜索文档树是通过指定标签名来搜索元素,还可以通过指定标签的属性值来精确定位某个节点元素,最常用的两个方法就是 find 和 find_all。这两个方法在 BeatifulSoup 和 Tag 对象上都可以被调用。

find_all()方法

find_all( name , attrs , recursive , text , **kwargs )

第一个参数 name 是标签节点的名字。

# 所有p标签
soup.find_all("p")# [<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 class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#     <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> and
#     <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>;
#  and they lived at the bottom of a well.</p>,
# <p class="story">...</p>]

第二个参数是标签的class属性值

soup.find_all("p","title")
# 同上
soup.find_all("p",class_ ="title")# [<p class="title"><b>The Dormouse's story</b></p>]

kwargs 是标签的属性名值对。

import re
# 支持使用标签属性
soup.find_all(href="http://example.com/lacie")
soup.find_all(id="link2")# 支持使用正则
soup.find_all(href=re.compile("lacie"))# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]# 支持使用布尔类型
soup.find_all('a',id=True)

遍历和搜索相结合,先定位到 body 标签,再从 body 中找 a 标签.。

soup.body.find_all('a',id=True)

find()方法

find 方法跟 find_all 类似,唯一不同的地方是,它返回的单个 Tag 对象而非列表,如果没找到匹配的节点则返回 None。如果匹配多个 Tag,只返回第0个。

soup.body.find("a")
# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>

get_text()方法
获取标签里面内容,除了可以使用 .string 之外,还可以使用 get_text 方法,不同的地方在于前者返回的一个 NavigableString 对象,后者返回的是 字符串。

soup.body.find("a").get_text()
# Elsie

实际场景中我们一般使用 get_text 方法获取标签中的内容。

总结:

通过beautifulsoup我们能够解析大部分静态html网页,遍历和搜索组合方式定位html的标签,并获取相应标签的内容。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/195174.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【一个超简单的爬虫demo】探索新浪网:使用 Python 爬虫获取动态网页数据

探索新浪网&#xff1a;使用 Python 爬虫获取动态网页数据 引言准备工作选择目标新浪网的结构 编写爬虫代码爬取example.com爬取新浪首页部分内容解析代码注意&#xff1a; KeyError: href结果与展示 其他修改和适应注意事项 总结 引言 可以实战教爬虫吗&#xff0c;搭个环境尝…

快考个PMP,救救脆皮项目经理吧

最近&#xff0c;脆皮大学生在互联网上狠狠火了一把&#xff0c;各种稀奇古怪导致受伤的原因&#xff0c;各种意外骨折骨裂的方式&#xff0c;不断地刷新着网友的世界观。但喜番仔细思考&#xff0c;发现脆皮的不只是大学生&#xff0c;广大的打工人&#xff0c;特别是项目经理…

记录 | Mac微信双开

目的&#xff1a;在 mac 上微信双开 (1) 先打开并登录第一个微信&#xff1b; 2&#xff09;访达 -> 应用程序 -> 微信&#xff08;双指同时摁&#xff09;-> 显示包内容&#xff1b; 3&#xff09;依次打开以下⽂件夹 Contents -> MacOS -> 双击 WeChat 即可…

Ps:使用 Emoji 字符

Emoji 字符是一种在数字通讯中广泛使用的小图像或表情符号&#xff0c;用于表达情感、活动、物体、地点、天气情况等。 Emoji 源自日本&#xff0c;但现已成为全球数字沟通的一部分。这些字符通常是彩色的&#xff0c;并且能够在不同的设备和平台上保持一致性。 通常&#xff0…

EXPLAIN解析

针对以下sql进行解析 EXPLAIN SELECTdauk.id AS daukId,dasm.mailbox AS storeAccount,dau.id,dau.id AS userId,das.score AS score,das.sell_num AS sellNum,dapa.product_link AS productLink,dapa.able_category_ids AS ableCategoryIds,dac.parent_name AS parentName,da…

IPC/WHMA-A-620E- CN 中文版 2022 线缆及线束组件的要求与验收 ,已经发布

IPC/WHMA-A-620 - Revision E - : 线缆及线束组件的要求与验收Requirements and Acceptance for Cable and Wire Harness Assemblies 免费下载文件分享https://share.weiyun.com/h4MJ1oY8 IPC-WHMA-A-620E- CN 中文版 2022 线缆及线束组件的要求与验收.pdf_免费高速下载|百度网…

Matlab和python详解数独谜题问题

&#x1f517; 运行环境&#xff1a;Matlab、Python &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f4…

智能故障诊断期刊推荐【英文期刊】

lnformation Fusion【一区 影响因子18.6】 https://www.sciencedirect.com/journal/information-fusion IEEE Transactions on Industrial lnformatics【一区 影响因子12.3】 https://ieeexplore.ieee.org/xpl/RecentIssue.jsp?punumber9424 Journal of Manufacturing Syst…

Reactor网络线程模型

目录 传统下网络服务模型 事件监听模型 NIO核心概念 单线程Reactor模式 多线程Reactor模式 Kafka 的网络设计 主要概念 类比思维理解 参考文章 传统下网络服务模型 线程太多无法处理大规模请求 事件监听模型 NIO核心概念 nio是实现reactor模式的底层API代码 单…

使用 .NET Upgrade Assistant(升级助手)升级 .NET 老旧版本项目

使用 .NET Upgrade Assistant 升级 .NET 老旧版本项目 .NET Upgrade Assistant 概述.NET Upgrade Assistant 功能1、支持以下代码语言&#xff1a;2、支持的 .NET 升级路径&#xff1a;3、支持的项目类型&#xff1a; .NET Upgrade Assistant 安装1、使用 Visual Studio 扩展安…

中海达两项技术成果成功入选水利部第四届水文监测仪器设备推介名录

11月30日&#xff0c;由水利部科技推广中心主办&#xff0c;水利部国际合作与科技司和水利部水文司参与指导&#xff0c;长江水利委员会水文局和长江科学院共同协办的第四届水文监测仪器设备推介会在武汉香格里拉大酒店隆重举办&#xff0c;共有79家技术持有单位115项技术参会推…

上海亚商投顾:沪指探底回升 AI应用方向集体爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数早间震荡调整&#xff0c;深成指盘中跌超1%&#xff0c;午后探底回升全线翻红&#xff0c;北证50指数…

模板、STL标准模板库

模板 通常 对 具有相同要求的结果或者类 提供一个模板&#xff0c;根据实际使用时传过来的数据类型&#xff0c;决定函数和类的具体实现。 模板可以让类或者函数支持一种类型&#xff0c;这种通用类型在实际运行的过程中可以使用任何数据类型。 这种编程方式也成为"泛型编…

画图带你理清TCP协议三次握手和四次挥手

TCP 特性 1.确认应答机制 (ACK) 2.超时重传 3.建立连接 - 三次握手 4.断开连接 - 四次挥手 1.确认应答机制 (ACK) 确认应答是可靠传输的最核心机制&#xff0c;接收方反馈一个应答报文(ACK)&#xff0c;表示已收到 假设现在 A 想去 B 家里玩游戏&#xff0c;于是 A 给…

SEO外链工具,免费SEO引蜘蛛工具

随着互联网的迅猛发展&#xff0c;网站的排名成为各类企业的突破口。SEO&#xff08;Search Engine Optimization&#xff09;作为提高网站在搜索引擎中排名的重要手段&#xff0c;其成功与否直接关系到网站能否获得更多的曝光和流量。在SEO的世界中&#xff0c;引蜘蛛与外链的…

6-3 求3*3整数矩阵对角线元素之和

#include<stdio.h>int main(){int a[3][3],sum0;int i ,j;printf("输入元素&#xff1a;\n");for(i0;i<3;i)for(j0;j<3;j)scanf("%d",&a[i][j]);for(i0;i<3;i)sumsuma[i][i];printf("总和为&#xff1a;%d",sum);return 0;}

如何购买阿里云服务器

作为一家全球领先的云计算服务提供商&#xff0c;阿里云提供了多种云产品和解决方案&#xff0c;包括云服务器、对象服务OSS、数据库、存储、SSL、域名和CDN等。阿里云服务器是一种灵活可扩展的云计算服务&#xff0c;适用于各种规模和类型的企业和个人用户。阿里云以其出色的性…

邮件迁移-邮件同步-批量完成邮件迁移解决方案-imapsync

背景&#xff1a; 公司原来使用的邮箱服务器实现方式是james的cassandra-app&#xff0c;如今要启用新的邮件服务器&#xff0c;架构用的是james的distributed-app,升级后&#xff0c;要求邮件数据不丢失&#xff0c;因此要平滑完成邮件的迁移工作&#xff0c;保障升级后邮件不…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《考虑量化储热的多区域电–热综合能源系统优化调度》

标题 "考虑量化储热的多区域电–热综合能源系统优化调度" 可以分解为几个关键词和短语&#xff0c;我们逐步解读&#xff1a; 考虑量化储热&#xff1a; 考虑&#xff1a; 意味着在解决问题或进行研究时&#xff0c;会综合或纳入特定因素。量化&#xff1a; 将抽象的…

旺店通·企业奇门对接打通金蝶云星空查询店铺接口与客户新增接口

旺店通企业奇门对接打通金蝶云星空查询店铺接口与客户新增接口 数据源系统:旺店通企业奇门 旺店通是北京掌上先机网络科技有限公司旗下品牌&#xff0c;国内的零售云服务提供商&#xff0c;基于云计算SaaS服务模式&#xff0c;以体系化解决方案&#xff0c;助力零售企业数字化智…