Python BeautifulSoup 库使用教程

文章目录

  • 简介
  • 安装 BeautifulSoup 库
  • BeautifulSoup 库的导入
  • BeautifulSoup 库依赖的解析库
  • 创建 BeautifulSoup 对象
  • CSS选择器
    • 1、通过标签名查找
    • 2、通过 CSS 的类名查找
    • 3、通过 Tag(标签) 的 id 查找
    • 4、通过 是否存在某个属性来查找
    • 5、通过 某个标签是否存在某个属性来查找
  • 获取标签里面的文字内容
  • 获取标签里面属性的内容

简介

BeautiSoup 库主要用来解析 HTML 格式的网络文件,通过解析文档为用户提供需要抓取的数据。

安装 BeautifulSoup 库

对于BeautifulSoup ,目前 最新版本是 4.x 版本,已经移植到 BS4中,Soup 3已经停止开发。

pip install beautifulsoup4  -i  https://mirrors.aliyun.com/pypi/simple/

使用 pip list 查看是否安装成功
在这里插入图片描述

BeautifulSoup 库的导入

from bs4 import BeautifulSoup

BeautifulSoup 库依赖的解析库

BeautifulSoup 在解析的时候实际上是需要依赖于解析器的,它除了支持 Python 标准库中的 HTML 解析器,还支持一些第三方的解析器。

常见解析器比较:

解析器使用方法优势劣势
Python 标准库BeautifulSoup (markup, "html.parser")1、Python 的内置标准库

2、执行速度适中

3、文档容错能力强

Python 2.7.3 或 3.2.2 前的版本中 文档容错能力差
lxml HTML 解析器BeautifulSoup (markup, "lxml")1、速度快

2、文档容错能力强

需要安装C语言库
lxml XML 解析器BeautifulSoup (markup, "xml")1、速度快

2、唯一支持 XML 的解析器

需要安装C语言库
html5libBeautifulSoup (markup, "html5lib")1、最好的容错性

2、以浏览器的方式解析文档

3、生成HTML5 格式的文档

速度慢,不依赖外部拓展

创建 BeautifulSoup 对象

soup = BeautifulSoup(markup, features)
  • markup :要解析的 HTML 格式的字符串
  • features :要使用的解析器类型
    • "html.parser"
    • "lxml"
    • "xml"
    • "html5lib"

在这里插入图片描述

CSS选择器

在CCS中,标签名不加任何修饰,类名前加点,ID名前加 # ,在这里我们也可以用类似的方法来筛选元素,用到的方法是 soup.select() , 返回类型是 list

示例 html 文件:

<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="link3">Tillie</a>;
and they lived at the bottom of a well.</p><p class="story">...</p></body>
</htm1>

1、通过标签名查找

通过标签名可以直接查找、逐层查找,也可以找到某个标记下的直接子标记和兄弟节点标签。
标签名不加任何修饰,类名前加点,ID名前加 #

# 直接查找 title 标记
print( soup.select( "title" ) )
output: [<titile>The Dormouse’ s story</title>]

# 逐层查找 title 标记
print( soup.select( "html head title" ) )
output: [<titile>The Dormouse’ s story</title>]

# 查找 直接子节点
# 查找 head 下的 title 标签
print( soup.select( "head title" ) )
output: [<titile>The Dormouse’ s story</title>]

# 查找 p 下的 id=“link1” 的标签
print( soup.select( "p #link1" ) )
output: [<a class=“sister” href=“http://example.com/elsie” id=“link1”>\ </a>]

# 查找 兄弟节点
# 查找 id=“link1” 之后 class=sister 的所有兄弟标签
print( soup.select( "#link1 ~ .sister " ) )
output: [<a class=“sister” href=“http://example.com/lacie” id=“link2”> <!–Lacie–> </a>,
<a class=“sister” href=“http://example.com/tillie” id=“link3”> Tillie </a>]

# 查找 紧跟着 id=“link1” 之后 class=sister 的所有子标签
print( soup.select( "#link1 + .sister " ) )
output: [<a class=“sister” href=“http://example.com/lacie” id=“link2”> <!–Lacie–> </a>]

2、通过 CSS 的类名查找

print( soup.select( ".sister" ) )
output: [<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>]

3、通过 Tag(标签) 的 id 查找

print( soup.select( "#link3" ) )
output: <a class=“sister” href=“http://example.com/tillie” id=“link3”> Tillie </a>]

4、通过 是否存在某个属性来查找

# 查找 是标签a 并且有 href 属性的Tag
print( soup.select( "a[href]" ) )
output: [<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>]

5、通过 某个标签是否存在某个属性来查找

# 查找 是标签a 并且有 href 属性的Tag
print( soup.select( "a[href]" ) )
# 查找 是标签a 并且 id=‘link1’ 的Tag
print( soup.select( "a[ id='link1' ]" ) )

获取标签里面的文字内容

print( soup.title.string )

获取标签里面属性的内容

# 打印 标签p 的属性
# 返回的是一个字典
print( soup.p.attrs )# 获取 标签p 的class 属性值
print( soup.p['class'] )

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

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

相关文章

【微服务专题】手写模拟SpringBoot

目录 前言阅读对象阅读导航前置知识笔记正文一、工程项目准备1.1 新建项目1.1 pom.xml1.2 业务模拟 二、模拟SpringBoot启动&#xff1a;好戏开场2.1 启动配置类2.1.1 shen-base-springboot新增2.1.2 shen-example客户端新增启动类 三、run方法的实现3.1 步骤一&#xff1a;启动…

合并二叉树(Java)

题目描述 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新二叉树。合并的规则是&#xff1a;如果两个节点重…

耗时3年写了一本数据结构与算法pdf!开源了

前言 大家好&#xff0c;我是bigsai&#xff0c;很早就在写博客&#xff0c;我将csdn的文章整理成了一个pdf&#xff0c;并且开源到github上&#xff01; 自己写东西断断续续也不少时间了&#xff0c;也写了不少东西(虽然是偏向小白)&#xff0c;这个其实花费的时间还是比较多…

JuCheap开发的微信小程序商城(NetCore商城)

一、目的 最近工作需要&#xff0c;在学习微信小程序的开发&#xff0c;用周末空闲时间开发了一个微信小程序商城。 二、功能 2.1 管理后台 管理后台是基于JuCheap开发的&#xff0c;使用Net6Vue3ElementPlus开发&#xff0c;具体功能包含如下&#xff1a; 2.1.1 店铺模块…

BI 数据可视化平台建设(1)—交叉表组件演变实战

作者&#xff1a;vivo 互联网大数据团队 - Zhu Jianchen 本文是vivo互联网大数据团队《BI数据可视化平台建设》系列文章第1篇 - 交叉表组件。 交叉表在数据分析里应用广泛&#xff0c;通过本文&#xff0c;你将了解到&#xff1a; 交叉表的基本概念&#xff0c;以及BI可视化平…

有符号数是如何判断正负符号位的?

文章目录 有符号数是如何判断正负符号位的&#xff1f; 运行结果&#xff1a; 有符号数是如何判断正负符号位的&#xff1f; #include<stdio.h> int main() {int input_data 0;printf("Please input the data ! \n");scanf("%d",&input_data);…

Java必刷入门递归题×5(内附详细递归解析图)

目录 1.求N的阶乘 2.求12...N的和 3.顺序打印数字的每一位 4.求数字的每一位之和 5.求斐波拉契数列 1.求N的阶乘 &#xff08;1&#xff09;解析题目意思 比如求5的阶乘&#xff0c;符号表示就是5&#xff01;&#xff1b;所以5&#xff01;5*4*3*2*1我们下面使用简单的…

Openlayers:自定义Controls

Openlayers是一款优秀的二维开源地图框架,支持矢量/栅格图层,支持移动端,并且易于自定义和拓展。下面来讲述一下自定义Control的基本思路。 openlayers-features 问题描述 最近在做个人项目时,遇到了一个小问题,就是在地图中心添加一个十字针形状的符号,用来表示地图中心…

javaSE学习笔记(五)集合框架-Collection,List,Set,Map,HashMap,Hashtable,ConcurrentHashMap

目录 四、集合框架 1.集合概述 集合的作用 集合和数组的区别 集合继承体系 数组和链表 数组集合 链表集合 2.Collection 方法 集合遍历 并发修改异常 3.List List集合的特有功能&#xff08;核心是索引&#xff09; 集合遍历 并发修改异常产生解决方案ListItera…

文本处理大师:Linux中grep、sed和awk的绝佳教程

1 grep 搜索关键字 全局搜索正则表达式 1.1 基本格式 grep root passwd #过滤含有root关键字-e 多个过滤词 grep -e root -e bash pa grep -E "root|bin" pa # 等同于上面的命令-i 忽略大小写 -E 过滤 grep -E "\<root" passwd ##root字符之前不能有…

Android Studio真机运行时提示“安装失败”

用中兴手机真机运行没问题&#xff0c;用Vivo运行就提示安装失败。前提&#xff0c;手机已经打开了调试模式。 报错 Android Studio报错提示&#xff1a; Error running app The application could not be installed: INSTALL_FAILED_TEST_ONLY 手机报错提示&#xff1a; 修…

Leetcode—69.x的平方根【简单】

2023每日刷题&#xff08;二十七&#xff09; Leetcode—69.x的平方根 直接法实现代码 int mySqrt(int x) {long long i 0;while(i * i < x) {i;}if(i * i > x) {return i - 1;}return i; }运行结果 二分法实现代码 int mySqrt(int x) {long long left 0, right (l…