网页数据解析与爬取----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 的相关文章

  • 乐鑫面试流程

    乐鑫面试流程 面试岗位笔试技术面试HR面电话聊天发offer 面试岗位 嵌入式软件实习生 笔试 题目分为选择题和编程题 xff0c 选择题二十题 xff0c 编程题两题 xff1b 选择题基本是一些计算机相关基础知识 xff0c 比较简单
  • 全局变量和静态变量的初始化

    全局变量和静态变量的初始化 全局变量 static变量初始化时间静态局部变量全局变量 不要写出和编译顺序相关的程序总结 全局变量 static变量初始化时间 静态局部变量 首先 xff0c 静态局部变量和全局变量一样 xff0c 数据都存放
  • 不同操作系统及CPU字长、寻址能力、指针宽度的理解

    不同操作系统及CPU字长 寻址能力 指针宽度的理解 字长CPU位宽CPU的寻址能力操作系统32bit 64bit指针大小 字长 64位CPU和32位CPU中64和32的含义 xff1a 64和32指的是CPU中的寄存器 通用 的字长 xff
  • new和malloc的区别

    new和malloc的区别 1 new从自由存储区上分配内存 xff0c malloc从堆上分配内存 自由存储区是C 43 43 基于new操作符的一个抽象概念 xff0c 凡是通过new操作符进行内存申请 xff0c 该内存即为自由存储区
  • 程序中的负数存储及类型转换

    程序中的负数存储及类型转换 负数在计算机中怎样存储什么是原码 反码 补码为什么要设置反码 xff0c 补码剖析本质 C语言数据类型转换 xff08 自动类型转换 43 强制类型转换 xff09 自动类型转换强制类型转换类型转换只是临时性的自
  • Java Collections singleton()方法与示例

    集合类singleton 方法 Collections Class singleton method singleton method is available in java util package singleton 方法在java
  • 找素数问题

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • 嵌入式面试题

    面试题 字符串能直接比较大小吗typedef定义数组类型用法 字符串能直接比较大小吗 C 43 43 中字符串分两种 xff0c 一种是C语言的字符串 xff0c 一种是string字符串 C语言字符串是不可以直接比较大小的 xff0c s
  • 解决Endnote插入参考文献时导致word闪退问题

    问题描述 xff1a 通过endnote插入参考文献时 xff0c 会使得word闪退 原因分析 有像域代码之类的交互 xff0c 与endnote冲突 解决方法把word文档clean下 xff0c 即将域代码删除 解决方法 Ctrl 4
  • 音视频基础

    音视频基础 写在前面基础概念音视频直播推流和拉流什么是推流什么是拉流推流和拉流的区别 协议层 封装格式层 编解码层 像素层RTP RTCP RTMP RTSP区别RTP Real time Transport Protocol 实时传输协议
  • 回车和换行的区别

    回车和换行的区别 回车和换行的概念不同的系统间传递文件会涉及格式的转换Unix gt WindowsUnix lt Windows 回车和换行的概念 首先介绍一下 回车 xff08 carriage return r xff09 和 换行
  • 强大的PubMed插件Scholarscope

    强大的PubMed插件Scholarscope 学术基础 SCI分区什么是Pubmed什么是ScholarscopeScholarscope在不同浏览器下安装指南插件使用 学术基础 SCI分区 SCI是有两个分区 一个是JCR的划分 一般称
  • 反客STM32F4核心板DAP无法下载程序解决

    反客STM32核心板DAP无法下载程序解决 问题解决 问题 反客STM32F407ZGT6核心板使用反客的DAP下载器下载程序 xff0c 无法识别下载器 xff0c 说明下载器没有正常工作 xff08 这里是已经换过杜邦线了 xff0c
  • 有人物联网485转网口模块网口调试助手1035未知错误

    有人物联网485转网口模块网口调试助手1035未知错误 问题解决 问题 项目使用有人物联网485转网口模块USR TCP232 304 xff0c 将模块接入实验室路由器 xff0c IP地址设置为动态IP xff0c 路由器上查得IP为1
  • 1.半导体基础知识

    1 半导体基础知识 本征半导体什么是半导体 xff1f 什么是本征半导体 xff1f 本征半导体的结构本征半导体中的两种载流子为什么将自然界导电性能中等的半导体材料制成本征半导体 杂质半导体N型半导体P型半导体 PN结PN结中的扩散运动漂移
  • 2.半导体二极管

    2 半导体二极管 二极管的组成二极管和PN结伏安特性的区别二极管的伏安特性及电流方程为什么反向饱和电流越小 xff0c 单向导电性能越强 二极管的等效电路二极管的主要参数稳压二极管 xff08 又称齐纳二极管或反向击穿二极管 xff09 稳
  • Python | 从另一个列表的指定开始到结束索引创建一个列表

    Given a list start and end index we have to create a list from specified index of the list in Python 给定一个列表 xff0c 开始和结束索
  • EDA基础概念

    EDA基础概念 EDA和CADCAD工具EDA工具 EDA技术实现目标可编程逻辑器件简称PLD发展历程CPLD简介FPGA简介FPGA和CPLD区别是否需要同时学习FPGA和CPLDXilinx xff08 赛灵思 xff09 公司介绍 x
  • 半导体存储电路

    半导体存储电路 SR锁存器和触发器寄存器存储器存储器分类RAMSRAMDRAM ROMMROMPROMEPROMEEPROMFLASH原理发现者应用工作原理存储单元 磁盘硬盘机械硬盘 xff08 HDD xff09 固态硬盘 xff08 S
  • python编写简单的EXE启动器

    exe启动器 放假到现在一直憋在家里 xff0c 最近实在无聊 xff0c 就下了两个游戏玩 xff0c 玩的时候 xff0c 因为快捷方式放桌面感觉有点麻烦 xff0c path文件下图标有太多 xff0c 就想起了自己编写一个exe启动

随机推荐