网页数据解析与爬取----Beautiful Soup

2023-05-16

目录

  • 网页数据解析与爬取----Beautiful Soup
    • Beautiful Soup 使用
      • 1、Beautiful Soup简介
      • 2、解析器
      • 3、准备工作
      • 4、节点选择器
      • 5、提取信息
        • 1、获取名称
        • 2、获取属性
        • 3、获取内容
        • 4、嵌套选择
      • 6、关联选择
        • 1、子节点和子孙节点
        • 2、父节点和祖先节点
        • 3、兄弟节点
      • 7、方法选择器
        • 1、find_all
        • 2、name
        • 3、attrs
        • 4、text
        • 5、find
      • 8、CSS选择器
        • 1、嵌套选择
        • 2、获取属性
        • 3、获取文本

网页数据解析与爬取----Beautiful Soup

Beautiful Soup 使用

1、Beautiful Soup简介

1、解析工具Beautiful Soup,其借助网页的结构和属性等特性来解析网页
2、Beautiful Soup是Python的一个HTML或XML的解析库,可方便地从网页中提取数据,提供一些简单的、Python式的函数来处理导航、搜索、修改分析树等功能
3、Beautiful Soup自动将输入文档转换为Unicode编码,将输出文档转换为utf-8编码
4、Beautiful Soup可省去很多繁琐的提取工作,提高解析网页效率

2、解析器

Beautiful Soup在解析时是依赖解析器的,除了支持Python标准库中的HTML解析器,还支持一些第三方解析器
Beautiful Soup常用解析器
在这里插入图片描述

推荐使用LXML解析器,它有解析HTML和XML的功能,速度快、容错能力强

3、准备工作

1、安装Beautiful Soup库

pip install beautifulsoup4

2、基本使用

html = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title" name="dromouse"><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
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
# 调用prettify方法,这个方法可以把要解析的字符串以标准的缩进格式输出
print(soup.prettify())
# 调用soup.title.string,输出html中title节点的文本内容
print(soup.title.string)

4、节点选择器

说明:直接调用节点的名称即可选择节点,然后调用string属性就可得到节点内的文本,这个方法只会选择到第一个匹配的节点,后面的其他节点都会忽略

html = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title" name="dromouse"><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
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.title)
print(type(soup.title))
print(soup.title.string)
print(soup.head)
print(soup.p)

5、提取信息

1、获取名称

说明:利用name属性获取节点的名称

print(soup.title.name)  --> title

2、获取属性

一个节点可能有多个属性,例如id和class等,选择这个节点元素后,可调用attrs获取其所有属性

# 调用attrs属性的返回结果是字典形式,包括与哦所有选择节点的所有属性和属性值
print(soup.p.attrs)
print(soup.p.attrs['name'])
# 简写
print(soup.p['name'])
print(soup.p['class'])

3、获取内容

利用string属性获取节点元素包括的文本内容

# 只获取第一个节点
print(soup.p.string)

4、嵌套选择

html = """
<html><head><title>The Dormouse's story</title></head>
<body>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.head.title)
print(type(soup.head.title))
print(soup.head.title.string)

6、关联选择

在做选择过程中,有时不能一步就选到想要的节点,需要先选中某一个节点,再以它为基准选子节点、父节点、兄弟节点等

1、子节点和子孙节点

选取节点之后,如果想要获取它的直接子节点,可调用contents属性

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.p.contents) # 返回结果是列表类型

也可调用children属性得到相应的结果

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
# 返回结果是生成器类型
print(soup.p.children)
for i,child in enumerate(soup.p.children):
    print(i, child) 

如果要得到所有的子孙节点,可调用descendants属性

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
# 返回结果是生成器类型
print(soup.p.descendaants)
for i,child in enumerate(soup.p.descendaants):
    print(i, child) 

2、父节点和祖先节点

如果要获取某个节点元素的父节点,可调用parent属性

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
# 返回结果是生成器类型
print(soup.a.parent)

如果想获取所有祖先节点,可调用parents属性

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
# 返回结果是生成器类型
print(soup.a.parents)

3、兄弟节点

获取兄弟节点

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
# 获取节点的下一个兄弟节点
print('Next Sibling', soup.a.next_sibling)
# 获取节点的上一个兄弟节点
print('Prev Sibling', soup.a.previous_sibling)
# 返回后面的所有兄弟节点
print('Next Siblings', list(enumerate(soup.a.next_siblings)))
# 返回前面的所有兄弟节点
print('Prev Siblings', list(enumerate(soup.a.previous_siblings)))

7、方法选择器

1、find_all

find_all,查询所有符合条件的元素,可给它传入一些属性或文本来得到符合条件的元素

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

2、name

根据name属性查询元素

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(name='ul'))
print(type(soup.find_all(name='ul')[0]))

3、attrs

根据属性进行查询

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(attrs={'id':'list1'}))

4、text

text参数可以用来匹配节点的文本,其传入形式可以是字符串,也可是正则表达式对象

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(text=re.compile('link')))

5、find

find方法也可查询符合条件的元素,只不过find方法返回的是单个元素,即匹配第一个元素,而find_all会返回由所有匹配的元素组成的列表

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find(name='ul'))
print(soup.find(text=re.compile('link')))

说明:
find_parents和find_parent:前者返回所有祖先节点,后者返回直接父节点
find_next_siblings 和 find_next_sibling:前者返回后面的所有兄弟节点,后者返回后面第一个兄弟节点
find_previous_siblings 和 find_previous_sibling:前者返回前面所有兄弟节点,后者返回前面第一个兄弟节点
find_all_next 和 find_next:前者返回节点后面所有符合条件的节点,后者返回后面第一个符合条件的节点
find_all_previous 和 find_previous:前者返回节点前面所有符合条件的节点,后者返回前面第一个符合条件的节点

8、CSS选择器

只需调用select方法,传入相应的CSS选择器即可

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.select('.panel .panel-heading'))
print(soup.select('ul li'))

1、嵌套选择

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
for ul in soup.select('ul'):
    print(ul.select('li'))

2、获取属性

使用attrs获取属性

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
for ul in soup.select('ul'):
    print(ul['id'])
    print(ul.attrs['id'])

3、获取文本

使用string属性获取文本

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
for li in soup.select('li):
    print('Get text:', li.get_text())
    print('String:', li.string)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网页数据解析与爬取----Beautiful Soup 的相关文章

  • 基于STM32四轴飞控制作笔记

    基于STM32四轴飞控制作笔记 前言 大四选了个四轴飞控作为毕业设计的题目 xff0c 近来没事 xff0c 把之前的制作做个总结开源出来 硬件设计 1 遥控MCU模块和飞控的MCU模块都采用stm32f103c8t6单片机 xff0c 很
  • ubuntu20.04 ROS打开gazebo 世界一片灰,模型没有显示颜色

    文章目录 2023年2月10日 更新原回答配置问题描述解决方案其他 2023年2月10日 更新 Win11 43 Ubuntu20 04双系统 43 ROS noetic 影子不显示 xff0c 模型没颜色 大概率是显卡的问题 xff0c
  • STM32学习笔记:PWM互补输出(无刷直流电机驱动控制)

    需要达成的目的为CH1通道输出PWM波 xff0c CH1N通道输出高电平等 最新方法已在新博客贴出 xff0c 更为简便 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 6
  • Postman如何设置成中文?(汉化)

    一 汉化补丁下载安装 点击下方这个链接 xff0c 进入gitee xff0c 在里面下载一个插件 我在写这篇文章的时候 xff0c 补丁包的最新版本号为 9 12 2 xff1a 下载 Postman 汉化补丁包 汉化补丁下载链接 xff
  • 记录:在ubuntu中以C语言实现json文件读取遇到的问题(1)(说不定会有2)

    4 12 记录在ubuntu中以C语言实现json文件读取遇到的问题 xff08 1 xff09 xff08 说不定会有2 xff09 暂记录遇到的问题及解决 xff0c 其中还有些原因没有搞明白 xff09 1 首先过程参考自一位大佬的博
  • 标量/向量/矩阵求导方法

    这篇博客源于在看论文时遇到了一个误差向量欧氏距离的求导 xff0c 如下 xff1a 在看了一堆资料后得出以下结论 xff1a 这个结论是怎么来的呢 xff1f 这就涉及标量 向量 矩阵的求导了 由于标量 向量都可以看做特殊的矩阵 xff0
  • 自学笔记:单片机蜂鸣器(包含程序)

    蜂鸣器的工作原理 xff08 搬运 xff09 蜂鸣器主要分为压电式蜂鸣器 无源蜂鸣器 和电磁式蜂鸣器 xff08 有源蜂鸣器 xff09 两种类型 压电式蜂鸣器 主要由多谐振荡器 压电蜂鸣片 阻抗匹配器及共鸣箱 外壳 等组成 多谐振荡器由
  • Invalid bound statement (not found):常见报错原因解决

    问题场景 xff1a 在SpringMVC项目中 xff0c 通过mapper接口加载映射文件 xff0c 完成数据库的操作 问题描述 报错 xff1a Invalid bound statement not found 原因分析 xff1
  • 记录一次策略模式优化代码案例

    策略模式优化案例 优化之前 优化之后 把原来的switch case 用接口方式实现 bean 注入采用map方式 key为 实现类的名称 xff0c value为实现类的bean xff0c 在所有bean注入之后执行init 方法 xf
  • 树莓派无屏幕连接

    无屏幕通过VNC显示树莓派远程桌面 我自己本来是有一个7寸屏幕的 xff0c 但是因为机器人那边需要看IP地址 xff0c 我就把屏幕装在机器上上面了 xff0c 只能vnc连接了 刷好系统的时候 xff0c 现在版本的树莓派是默认没有ss
  • SMPL论文解读和相关基础知识介绍

    SMPL论文解读和相关基础知识介绍 本文首发于微信公众号 视觉三维重建 欢迎大家关注公众号 和你分享计算机视觉算法工程师工作的点点滴滴 文章目录 SMPL论文解读和相关基础知识介绍 1 动画制作专业术语 2 SMPL 2 1 简介 2 2
  • 学术论文阅读方法

    文章目录 学术论文阅读过程大量阅读学术论文方法 xff1a 目的 xff1a 复现优秀论文提出创新点整理成文 看不懂怎么办幻灯博客视频课程代码 More研究生生活工作业务要求英语老师建议 近期基本完成机器学习和深度学习的学习 xff0c 开
  • 微信小程序未读消息右上角红点数字显示

    从weui中获得灵感 xff0c 稍微改造 xff0c 效果还不错 在消息数量为1 99时正常显示即可 xff0c 而大于99时显示99 43 使用wx if搞定 wxml部分 xff1a span class token tag span
  • [2022]李宏毅深度学习与机器学习第十五讲(必修)-Meta Learning

    2022 李宏毅深度学习与机器学习第十五讲 xff08 必修 xff09 Meta Learning 做笔记的目的Meta LearningML vs meta learningWhat is learnable in learning a
  • 浅谈esp8266

    esp8266 前言简单介绍esp8266esp8266的开发方式主流应用结语 前言 很早就听说了esp8266 xff0c 作为物联网上的入门级产品 xff0c 有一段时间曾在b站上掀起过一阵风潮 xff0c 什么用来获取显示b站粉丝量
  • 【无标题】

    一级标题1 QGC二次开发方法 手段 xff08 包括基本介绍 xff09 一级标题2 QGC编译过程步骤以及中遇到的问题和相应的解决办法 1 QGC二次开发方法 手段 xff08 包括基本介绍QGC和QT xff09 QGC二次开发工具
  • 实数插值方法及其 python 实现

    本文主要介绍两种常用的实数插值方法 xff1a 拉格朗日 xff08 Lagrange xff09 插值 以及 牛顿 xff08 Newton xff09 插值 及其python实现 运行效果如下 xff1a 目录 1 拉格朗日插值 2 牛
  • VS CMake 禁止警告

    cmake minimum required VERSION 3 0 project DiableWarn if WIN32 add compile options W4 add compile options wd4100 add com
  • Failed to read artifact descriptor for xxx:jar maven deploy的问题解决

    Failed to read artifact descriptor for xxx jar maven deploy的问题解决 问题描述问题分析可用方案 问题描述 我们项目使用的自定义jar包 xff0c 上传到私服仓库中 xff0c 其
  • 移动通信中的信道编码基础

    线性分组码 假设信源输出为有限域GF xff08 2 xff09 上连续的二元符号序列 xff0c 称为消息序列 在分组码中每一个消息分组含有k个信息比特 xff0c 一共有2k个不同的消息 xff0c 对应2k个不同的码字 所有码字的集合

随机推荐

  • 【Linux多线程服务端编程】| 【01】线程安全的对象生命期管理笔记

    文章目录 索引一 线程安全的对象生命期管理1 1 析构函数遇多线程1 2 对象销毁1 3 线程安全的observer多难1 4 原始指针有什么不好的地方1 5 shared ptr或weak ptr1 6 系统地避免指针错误1 7 应用到O
  • 计算机保研面试题总汇(网上搜集的题 自己写的答案)

    文章目录 计算机专业知识数学方向内容高数线代概率论 其他 计算机专业知识 哪些图算法中用到了动态规划的思想 xff1f Floyd算法 背包算法 TSP 进程之间的通信方式 管道Pipe 命名管道FIFO 消息队列MQ 共享存储 信号量 套
  • VSLAM框架:ORB_SLAM2采用ROS Bag获取数据

    ORB SLAM2采用ROS Bag获取数据 前言一 ROS bag数据1 ROS bag简介2 获取数据集3 查看数据集信息 二 配置文件1 配置ros文件2 配置内参文件三 启动节点1 回放ROS bag数据集2 深度相机节点 前言 之
  • for无限循环

    span class token keyword int span i span class token operator 61 span span class token number 0 span span class token pu
  • Dockerfile【超级详细】

    Dockerfile 基础知识 FROM 基础镜像 xff0c 一切从这里开始构建 MAINTAINER 镜像是谁写的 xff0c 姓名 43 邮箱 RUN 镜像构建的时候需要运行的命令 ADD 步骤 xff0c tomcat镜像 xff0
  • VDO(虚拟数据优化器)原理及配置

    1 原理 VDO xff08 Virtual Data Optimize xff09 是RHEL8 Centos8上新推出的一个存储相关技术 xff08 最早在7 5测试版中开始测试 xff09 xff0c 是Redhat收购的Permab
  • 2022爱分析·SD-WAN市场研究报告 | 爱分析报告

    报告编委 报告指导人 黄勇 爱分析 合伙人 amp 首席分析师 报告执笔人 潘天 爱分析 高级分析师 易丹 爱分析 分析师 于婉贞 爱分析 分析师 目录 1 SD WAN重构企业广域网接入市场 2 重点行业先发 xff0c SD WAN市场
  • numpy 对二维数组的常用操作

    目录 1 提取二维数组的某几列或某几行 2 获取某个范围的数据 3 所有元素求和 4 计算数组中非零元素的个数 5 使用布尔型掩码提取某些行或某些列 6 获取数组的行数或列数 7 获取最后一列 xff08 或行 xff09 的元素 8 获取
  • 群起集群 DataNode 没有启动的解决方法

    错误 启动服务 xff0c 发现没有DataNode没有启动 此原因是namenode和datanode的clusterID不一致导致datanode无法启动 产生的原因 是多次hdfs namenode format而造成的 每一次格式化
  • ajax实现图片的回显功能

    前端页面 给文件上传域绑定一个改变事件 lt tr gt lt td class 61 34 three 34 gt 图片介绍 lt td gt lt td gt lt br gt lt div id 61 34 imgDiv 34 sty
  • 为ESP8266编译时出错

    图 1 当出现图1的问题时 xff0c 是因为我们的文件扩展名为 c 实测当我们将文件扩展名改为 cpp的时候就能如图二一样正常编译 图2 由于C 43 43 是全面兼容C的 xff0c 即使我们之前使用的是C语言 xff0c 在更改文件后
  • 点云上的深度学习及其在三维场景理解中的应用————3D Scene Understanding with PointNet and PointNet++(三)

    最近在学3D方向的语义分析 师兄推荐了一个哔哩大学的将门创投 斯坦福大学在读博士生祁芮中台 xff1a 点云上的深度学习及其在三维场景理解中的应用 xff01 的宝藏视频 xff0c 我会多看几遍 xff0c 并写下每次观看笔记 up主的个
  • https://img-blog.csdnimg.cn/44575f55b6a7431392616b45e051dd2e.png——分割线专用图专用图

    https img blog csdnimg cn 44575f55b6a7431392616b45e051dd2e png
  • ROS小车——摄像头的使用(3)

    文章目录 前言一 摄像头驱动和图像的查看1 摄像头驱动2 图像的查看 二 Opencv人脸检测1 启动人脸检测应用2 虚拟机查看3 虚拟机查看人体检测4 人脸识别应用 前言 ROS小车的摄像头驱动和图像的查看 xff0c 以及opencv的
  • STM32:结构体总结

    1 什么是结构体 我们知道数据的基本类型有 int 整形 char 字符形 unsigned int 无符号整形 unsigned char 无符号字符形 等 还包括数组等 但有些情况下 这些都 无法满足现实的需求 于是程序员把所需变量组织
  • opencv面试题

    数字图像的概念和起源 常见的成像方式 图像直方图 有什么用 xff1f 图像二值化 含义 xff1a 纵轴是像素的个数 xff0c 左到右是黑色到白色 图像平移 图像缩放 xff1a 图像缩放必然会涉及图像插值 最近邻插值 xff1a 如何
  • 力扣刷题(c++日常总结)

    map 的几种遍历方式 for auto k v map cout lt lt k lt lt v lt lt endl for auto kv map cout lt lt kv first lt lt kv second lt lt e
  • 用 IIFE 以封装 BOM对象提供的方法

    1 文件转 Base64 span class token keyword const span blob2Base64 span class token operator 61 span span class token punctuat
  • 先验概率、后验概率及贝叶斯公式的理解

    目录 1 条件概率 2 全概率公式 3 先验概率 4 后验概率 5 贝叶斯 xff08 bayes xff09 公式 介绍这些概念之前 xff0c 首先需要了解 条件概率 及 全概率公式 1 条件概率 在事件 B 发生的条件下事件 A 发生
  • 网页数据解析与爬取----Beautiful Soup

    目录 网页数据解析与爬取 Beautiful SoupBeautiful Soup 使用1 Beautiful Soup简介2 解析器3 准备工作4 节点选择器5 提取信息1 获取名称2 获取属性3 获取内容4 嵌套选择 6 关联选择1 子