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的标签,并获取相应标签的内容。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Facebook引流脚本的优势与编写教程!

在当今的数字化时代&#xff0c;社交媒体已经成为企业进行营销和推广的重要渠道之一&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;拥有数十亿的用户&#xff0c;为企业提供了无限的引流可能性。 然而&#xff0c;对于企业来说&#xff0c;在Facebook上吸引…

Java se之类和对象

目录 类的定义格式如何去自定义this的引用如何初始化对象构造方法的定义和使用 类的定义格式 class ClassName{ //属性(成员变量) //行为(成员方法) } 1>变量与方法 1.成员变量:普通成员变量 静态成员变量 2.成员方法:普通成员方法 静态成员方法 其中的静态变量与方法,在后…

传输层之TCP协议

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

最优化理论复习--对偶理论及灵敏度分析(一)

文章目录 上一篇对偶表示对偶问题的基本性质对偶问题的经济学解释&#xff1a;影子价格下一篇 上一篇 最优化理论复习–单纯形方法 对偶表示 一般情况&#xff1a; 对偶问题与原问题的字母表示: 对偶表示运用表格&#xff1a; m i n ⇒ m a x min \Rightarrow max min⇒m…

AI创作系统ChatGPT网站源码,AI绘画,支持GPT联网提问/即将支持TSS语音对话功能

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

【sgAutocomplete】自定义组件:基于elementUIel-autocomplete组件开发的自动补全下拉框组件(带输入建议的自动补全输入框)

特性&#xff1a; 1、支持本地保存选中过的记录 2、支持动态接口获取匹配下拉框内容 3、可以指定对应的显示label和字段组件key 4、自动生成速记符字段&#xff08;包含声母和全拼两种类型&#xff09;&#xff0c;增强搜索匹配效率 sgAutocomplete源码 <template><!…

【Linux】无法使用 screenfetch 查看系统信息,报错 command not found: screenfetch

问题描述 screenfetch是一个命令行工具&#xff0c;用于在终端显示系统的硬件和软件信息。它会收集各种系统和环境的信息&#xff0c;并以彩色 ASCII 艺术的形式在终端中展示出来。 当你在终端中运行screenfetch命令时&#xff0c;它会检测你的操作系统、主机名、内核版本、C…

利用eclipse导入外部java工程

利用eclipse导入外部java工程&#xff0c;打开eclipse&#xff0c;依次点击File-Import&#xff0c;…按下图依次执行…

vue中使用video.js播放m3u8格式的视频

文章目录 一、前言1.1、[官网](https://docs.videojs.com/)1.2、[Github](https://github.com/videojs/video.js) 二、实现2.1、安装依赖2.2、main.js2.3、video.vue2.4、其它 三、最后 一、前言 实时推送的视频流的需求&#xff0c;vue中就可以使用video.js播放m3u8格式的视频…

在 Mac 上使用浅色或深色外观

在 Mac 上&#xff0c;选取苹果菜单 >“系统设置”&#xff0c;然后点按边栏中的“外观” 。&#xff08;你可能需要向下滚动。&#xff09;选择右侧的“浅色”、“深色”或“自动”。 “浅色”表示不会发生变化的浅色外观。 “深色”表示不会发生变化的深色外观。“深色模式…

火狐浏览器无法打开有道云笔记网页解决

User-Agent Switcher and Manager 安装插件&#xff1a;User-Agent Switcher and Manager 可以直接在火狐插件管理中搜索&#xff0c;或者打开 https://addons.mozilla.org/zh-CN/firefox/addon/user-agent-string-switcher/?utm_sourceaddons.mozilla.org&utm_mediumre…

Spring MVC详解、静态资源访问、拦截器

1. Spring MVC概述 1.1 Spring MVC是什么 SpringMVC是Spring的一个模块&#xff0c;是一个基于MVC设计模式的web框架。 1.2 Spring MVC执行流程。 1.3 组件分析 前端控制器&#xff08;默认配置&#xff09;Dispatcher Servlet 作用&#xff1a;只负责分发请求。可以很好的对…

做题笔记:SQL Sever 方式做牛客SQL的题目--查询每天刷题通过数最多的前二名用户

----查询每天刷题通过数最多的前二名用户id和刷题数 现有牛客刷题表questions_pass_record&#xff0c;请查询每天刷题通过数最多的前二名用户id和刷题数&#xff0c;输出按照日期升序排序&#xff0c;查询返回结果名称和顺序为&#xff1a; date|user_id|pass_count 表单创建…

二十一章网络通信

计算机网络实现了多台计算机间的互联&#xff0c;使得它们彼此之间能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序&#xff0c;这些程序借助于网络协议&#xff0c;相互之间可以交换数据。编写网络应用程序前&#xff0c;首先必须明确所要使用的网络协议…

如何搭建废品上门回收小程序

如今&#xff0c;随着环境保护意识的增强&#xff0c;废品的回收和再利用变得越来越重要。为了方便人们进行废品回收&#xff0c;搭建一个废品上门回收的小程序成为了一个不错的选择。本文将介绍如何从零开始搭建一个废品上门回收小程序。 …

JavaSE50题:16.(递归)按顺序打印一个数字的每一位(例如 1234,打印出 1 2 3 4)

文章目录 概述代码执行过程执行结果 概述 按顺序打印一个数字的每一位&#xff08;例如 1234&#xff0c;打印出 1 2 3 4&#xff09;。 因为我们是要按顺序打印1 2 3 4&#xff0c;所以&#xff0c;递归过程的流程图&#xff0c;如图所示&#xff1a; 代码 public static v…

HL 7 是什么

HL7 指的是一组用于在各种医疗服务提供者所使用之软件应用程序之间&#xff0c;传输临床和管理数据的国际标准。这些标准侧重于应用层&#xff0c;即OSI模型中的“第7层”。 HL7标准由国际标准组织Health Level Seven International制作&#xff0c;并被美国国家标准协会和国际…

yum源不起作用_yum无法安装程序_Linux默认源替换---Linux工作笔记067

今天在一台机器上进行安装yum install的时候提示,yum不可用,这时候,折腾了一会 后来更换了默认源就可以了. 首先: 可以看到原来的里面有个 yum.repos.d 里面放了很多源,但是这些源是不可以联网的. 是内网的源,所以,我对他进行了 mv yum.repos.d yum.repos.d.bak 重命名 然…

pytorch优化之SAM优化器

1. SAM介绍 人机验证 2. 案例 ❀精度优化❀优化策略1&#xff1a;网络SAM优化器_夏天&#xff5c;여름이다的博客-CSDN博客文章浏览阅读3.3k次&#xff0c;点赞10次&#xff0c;收藏30次。精度优化策略&#xff1a;SAM:Sharpness AwarenessMinimization锐度感知最小化论文&…

实验3.5 路由器的单臂路由配置

实验3.5 路由器的单臂路由配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.SWA的基本配置2.RA的基本配置3.在RA上查看接口状态 六、任务验收七、任务小结 一、任务描述 某公司对部门划分了需VLAN之后&#xff0c;发现两个部门之间无法通信&#xff0c;但…