python从入门到精通(十六):python爬虫的BeautifulSoup4
python爬虫的BeautifulSoup4
- BeautifulSoup4
- 导入模块
- 解析文件
- 创建对象
- python解析器
- beautifulsoup对象的种类
- Tag获取整个标签
- 获取标签里的属性和属性值
- Navigablestring 获取标签里的内容
- BeautifulSoup获取整个文档
- Comment输出的内容不包含注释符号
- BeautifulSoup文档遍历
- BeautifulSoup文档搜索
BeautifulSoup4
导入模块
from bs4 import BeautifulSoup
解析文件
如果是本地文件,直接以写入权限打开,并用bs解析
with open('index.html', 'r', encoding='utf-8') as f:html = f.read()
如果是网页文件,则需要先用爬虫爬取,然后解析
response = requests.get(url=url, headers=headers)
html = response.text
创建对象
解析的第一步,是构建一个BeautifulSoup对象,基本用法:
response = requests.get(url=url, headers=headers)
html = response.text
soup = beautifulsoup(html,'html.parser') #处理html的解析器
python解析器

soup = beautifulsoup(html,'html.parser')
soup = beautifulsoup(html,'lxml')
soup = beautifulsoup(html,'xml')
beautifulsoup对象的种类
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
- Tag
- NavigableString
- BeautifulSoup
- Comment
Tag获取整个标签
tag中最重要的属性:name和attributes
from bs4 import BeautifulSoup
# 逐一解析数据 把html使用html.parser进行解析
bs = BeautifulSoup(html,"html.parser")
print(bs.a) # 返回找到的第一个a标签,返回时的整个标签 Tag
print(bs.title)
<title>百度一下你就知道<title>
获取标签里的属性和属性值
bs = BeautifulSoup(html,"html.parser")
print(soup.head.name) # name 返回标签的名字#head
print(bs.a.attrs) # 返回找到的第一个title标签的属性和属性值,字典形式
{'href': 'https://accounts.douban.com/passport/login?source=movie', 'class': ['nav-login'], 'rel': ['nofollow']}
print(bs.a.attrs['href']) #查看某个属性的值
'https://accounts.douban.com/passport/login?source=movie'# 获取p标签的属性
bs.a.attrs(返回字典) or soup.p.attrs['class'](class返回列表,其余属性返回字符串)
bs.a.['class'](class返回列表,其余属性返回字符串)
bs.a.get('class')(class返回列表,其余属性返回字符串)
Navigablestring 获取标签里的内容
bs = BeautifulSoup(html,"html.parser")
print(bs.title.string) # 返回找到的第一个title标签的内容 字符串
百度一下你就知道
bs.title.string
bs.title.text
bs.title.get.text()
BeautifulSoup获取整个文档
bs = BeautifulSoup(html,"html.parser")
print(bs) # 返回整个文档的内容
Comment输出的内容不包含注释符号
soup = BeautifulSoup('<p class="t1"><!-- <div class="env">env的信息内容</div> --></p>', 'html.parser')
print(soup.p.string)
#如果标签内部的内容是注释,例如:<!-- -->;那么该NavigableSring对象会转换成Comment对象,并且会把注释符号去掉。
<div class="env">env的信息内容</div>
BeautifulSoup文档遍历
contens:获取所有子节点(仅仅获取子标签)
bs = BeautifulSoup(html,"html.parser")
print(bs.a.contens) # 返回a中的所有contens 列表形式 可以用列表遍历
print(bs.a.contens[2])
children:获取所有子节点(仅仅获取儿子),返回列表生成器,用于遍历
or child in soup.body.children:print(child)
descendants:获取所有子孙节点(获取全部子孙后代),返回列表生成器,用于遍历
for child in soup.body.descendants:print(child)
parent:返回某节点的直接父节点(仅仅获取父亲)
p = soup.p
print(p.parent.name)
#body
parents:返回某节点的所有父辈及以上辈的节点(父亲的父亲的父亲…都获取)
content = soup.head.title.string
for parent in content.parents:print(parent.name)
## 结果
title
head
html
[document]
next_sibling:获取该节点的下一个兄弟节点,结果通常是字符串或空白,因为空白或者换行也可以被视作一个节点。
previous_sibling:获取该节点的上一个兄弟节点。
print(soup.p.next_sibling)
# 实际该处为空白
print(soup.p.prev_sibling)
#None 没有前一个兄弟节点,返回 None
next_siblings:迭代获取该节点之前的全部兄弟节点。
next_siblings:迭代获取该节点之后的全部兄弟节点。
BeautifulSoup文档搜索
1.find()
查找第一个与字符串完全匹配的内容
bs = BeautifulSoup(html,"html.parser")
a_list = bs.find("a") # 查找第一个的a标签
返回一个对象
a_list = bs.find('a')
a_list = bs.find('a', class_='xxx') # 注意class后的下划线
a_list = bs.find('a', title='xxx')
a_list = bs.find('a', id='xxx')
a_list = bs.find('a', id=compile(r'xxx'))
2.find_all()
字符串过滤,会查找所有与字符串完全匹配的内容
bs = BeautifulSoup(html,"html.parser")
a_list = bs.find_all("a") # 查找所有的a标签
a_list = bs.find_all('a')
a_list = bs.find_all(['a','span']) #返回所有的a和span标签
a_list = bs.find_all('a', class_='xxx')
a_list = bs.find_all('a', id=compile(r'xxx'))
# 提取出前两个符合要求的
soup.find_all('a', limit=3)
3.find_parent
查找当前标签的父标签
bs = BeautifulSoup(html,"html.parser")
a_list = bs.find("a").find_parent('div') # 查找当前a标签的父div标签
4.find_next_sibling
查找当前标签的下一个兄弟标签
bs = BeautifulSoup(html,"html.parser")
a_list = bs.find("a").find_next_sibling('div') # 查找当前a标签的下一个div标签
5.find_previous_sibling
查找当前标签的前一个兄弟标签
bs = BeautifulSoup(html,"html.parser")
a_list = bs.find("a").find_previous_sibling('div') # 查找当前a标签的前一个div标签
2.search()
正则表达式搜索:使用search()方法来匹配内容
a_list = bs.find_all(re.compile("a"))
3.get_text()
获取标签内的文本内容
a_list = bs.find("a").get_text()
3.prettify()
格式化解析文本 自动为标签间添加换行符
soup = BeautifulSoup(ht, 'lxml')
soup.prettify()
3.自己写方法查询
def name_is_exists(tag):return tag.has_attr("name") # 查询标签中属性的名字为name的t_list = bs.find_all(name_is_exists)
for tag in t_list:print(tag)
4.kwargs 参数
t_list = bs.find_all(id="head") # 查找所有的id=head的标签
t_list = bs.find_all(class=True)
t_list = bs.find_all(herf="http://news.baidu.com")
5.text参数
t_list = bs.find_all(text="hao123") # 查找所有的id=head的标签
t_list = bs.find_all(text=["hao123","新闻","贴吧"])
for tag in t_list:print(tag)
t_list = bs.find_all(text = re.compile("\d")) # 应用正则表达式来查找包含特定文本的内容
6.limit参数
t_list = bs.find_all("a",limit=3) # 查找前三个a标签
7.css选择器
t_list = bs.select("a") # 查找所有的a标签
t_list = bs.select(".mnav") # 查找所有的类名为.mnav标签
t_list = bs.select("#u1") # 查找所有的id为#u1的标签
t_list = bs.select("a[class='bri']") # 查找属性为bri的标签
t_list = bs.select("head>title") # 查找head标签下的title标签
t list = bs.select(".mnav ~ .bri") # 查找.mnav的兄弟标签.bri的text
print(t_list[0].get_text())
相关文章:
python从入门到精通(十六):python爬虫的BeautifulSoup4
python爬虫的BeautifulSoup4 BeautifulSoup4导入模块解析文件创建对象python解析器beautifulsoup对象的种类Tag获取整个标签获取标签里的属性和属性值Navigablestring 获取标签里的内容BeautifulSoup获取整个文档Comment输出的内容不包含注释符号BeautifulSoup文档遍历Beautifu…...
Codeforces Round 924(Div.2) A~E
A.Rectangle Cutting (模拟) 题意: 给出一个长方形,通过平行于原始矩形的一条边进行切割,将该矩形切割成两个边长为整数的矩形。询问是否能通过旋转和移动这两个矩形,得到新的矩形。 分析: 可以发现拼成的新长方形…...
django中实现观察者模式
在Django中实现观察者模式,你可以利用Django的信号(Signals)系统。Django的信号提供了一种发布/订阅模型,允许解耦应用程序组件之间的交互。一个组件可以发送一个信号,而其他组件可以监听这个信号并响应它。 下面是如…...
Elasticsearch中的动态DSL解决方案
目录 问题背景 解决方案 编写es的mapper 动态dsl编写 使用mapper获取动态dsl 远程调用restful api查询 问题背景 在大数据量的业务系统中,一般都会引入Elasticsearch来作为搜索引擎,而搜索的条件又是多种多样的。回顾下,如果是mysql等…...
【操作系统】MacOS虚拟内存统计指标
目录 命令及其结果 参数解读 有趣的实验 在 macOS 系统中,虚拟内存统计指标提供了对系统内存使用情况和虚拟内存操作的重要洞察。通过分析这些指标,我们可以更好地了解系统的性能状况和内存管理情况。 命令及其结果 >>> vm_stat Mach Virtu…...
LeetCode:67.二进制求和
67. 二进制求和 - 力扣(LeetCode) 又是一道求和题,% / 在求和的用途了解了些, 目录 题目: 思路分析: 博主代码: 官方代码: 每日表情包: 题目: 思路分析…...
修改GI文件的权限
参考文档: How to check and fix file permissions on Grid Infrastructure environment (Doc ID 1931142.1) -- 验证二进制文件的权限 [gridnode19c01 ~]$ cluvfy comp software -n node19c01 -verbosePerforming following verification checks ...Software …...
OJ刷题:杨氏矩阵【建议收藏】
看见这个题目,很多人的第一反应是遍历整个数组查找数字,但是这种方法不仅效率低,而且远远不能满足题目要求。下面介绍一种高效的查找方法: 代码实现: #include <stdio.h>int Yang_Find_Num(int arr[][3], int …...
2024-02-13 Unity 编辑器开发之编辑器拓展4 —— EditorGUIUtility
文章目录 1 EditorGUIUtility 介绍2 加载资源2.1 Eidtor Default Resources2.2 不存在返回 null2.3 不存在则报错2.4 代码示例 3 搜索框查询、对象选中提示3.1 ShowObjectPicker3.2 PingObject3.3 代码示例 4 窗口事件传递、坐标转换4.1 CommandEvent4.2 GUIPoint 和 ScreenPoi…...
redis加锁实现方式
思考 是否有官方推荐(自己先思考如何实现,然后再参考其他人的实践,总结优缺点)通过哪些方式可以实现锁锁是否具有原子性锁请求失败了如何处理如果避免发生死锁如果避免发生资源抢占如果避免锁的误删 官方实现策略 安全性能&#…...
ClickHouse--08--SQL DDL 操作
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 SQL DDL 操作1 创建库2 查看数据库3 删除库4 创建表5 查看表6 查看表的定义7 查看表的字段8 删除表9 修改表9.1 添加列9.2 删除列9.3 清空列9.4 给列修改注释9.5 修…...
5种风格非常经典的免费wordpress主题
免费wordpress主题下载 高端大气上档次的wordpress主题,也可以是免费的,可以在线免费下载。 https://www.wpniu.com/themes/288.html wordpress免费主题 高端大气的wordpress免费主题,LOGO在顶部左侧,导航菜单在顶部右侧。 ht…...
「数据结构」哈希表2:实现哈希表
🎇个人主页:Ice_Sugar_7 🎇所属专栏:Java数据结构 🎇欢迎点赞收藏加关注哦! 实现哈希表 🍉扩容🍉插入🍉获取value🍉源码 🍉扩容 在讲插入之前需要…...
ITK 图像分割(一):阈值ThresholdImageFilter
效果: Video: 区域增加分割 1、itkThresholdImageFilter 该类的主要功能是通过设置低阈值、高阈值或介于高低阈值之间,则将图像值输出为用户指定的值。 如果图像值低于、高于或介于设置的阈值之间,该类就将图像值设置为用户指定的“外部”值…...
2023.2.6
#include<stdio.h> #include<string.h> //冒泡排序 void bubb(int arr[],int len) {for(int i1;i<len;i){for(int j0;j<len-i1;j){if(arr[j1]<arr[j]){int tarr[j];arr[j]arr[j1];arr[j1]t;}}} } //select排序 void select(int arr[],int len) {int min0;…...
例39:使用List控件
建立一个EXE工程,在窗体上放一个文本框,一个列表框和三个按钮输入如下的代码: Sub Form1_Command1_BN_Clicked(hWndForm As hWnd, hWndControl As hWnd)List1.AddItem(Text1.Text)End SubSub Form1_Command2_BN_Clicked(hWndForm As hWnd, h…...
浏览器内核的主要功能模块介绍
浏览器内核是浏览器的核心部分,负责解析网页内容、渲染页面和处理用户交互。一个典型的浏览器内核主要包括以下几个功能模块: 1. **解析器(Parser)**: 解析器负责解析网页内容,包括HTML…...
如何流畅进入Github
前言 以下软件是免费的,放心用 一、进入右边的下载链接https://steampp.net/ 二、点击下载 三、点击接受并下载 四、随便选一个下载链接进行下载 五、软件安装好打开后,找到Github 六、点击全部启用 七、再点击左上角的一键加速 八、这个时候你再进Git…...
docker磁盘不足!已解决~
目录 🍟1.查看docker镜像目录 🧂2.停止docker服务 🥓3.创建新的目录 🌭4.迁移目录 🍿5.编辑迁移的目录 🥞6.重新加载docker 🍔7.检擦docker新目录 🍳8.删掉旧目录 1.查看doc…...
法国实习面试——计算机相关专业词汇
法语 1.Spcialit - 专业 2.Systme - 系统 3.Embarqus - 嵌入式 4.Logicielle - 软件 5.Distribus - 分布式 6.lectronique - 电子 7.nergie lectrique - 电能 8.Automatisation - 自动化 9.Une exprience de stage - 实习经验 10.Automobiles - 汽车 11.tre charg…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
