当前位置: 首页 > news >正文

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 (模拟) 题意&#xff1a; 给出一个长方形&#xff0c;通过平行于原始矩形的一条边进行切割&#xff0c;将该矩形切割成两个边长为整数的矩形。询问是否能通过旋转和移动这两个矩形&#xff0c;得到新的矩形。 分析&#xff1a; 可以发现拼成的新长方形…...

django中实现观察者模式

在Django中实现观察者模式&#xff0c;你可以利用Django的信号&#xff08;Signals&#xff09;系统。Django的信号提供了一种发布/订阅模型&#xff0c;允许解耦应用程序组件之间的交互。一个组件可以发送一个信号&#xff0c;而其他组件可以监听这个信号并响应它。 下面是如…...

Elasticsearch中的动态DSL解决方案

目录 问题背景 解决方案 编写es的mapper 动态dsl编写 使用mapper获取动态dsl 远程调用restful api查询 问题背景 在大数据量的业务系统中&#xff0c;一般都会引入Elasticsearch来作为搜索引擎&#xff0c;而搜索的条件又是多种多样的。回顾下&#xff0c;如果是mysql等…...

【操作系统】MacOS虚拟内存统计指标

目录 命令及其结果 参数解读 有趣的实验 在 macOS 系统中&#xff0c;虚拟内存统计指标提供了对系统内存使用情况和虚拟内存操作的重要洞察。通过分析这些指标&#xff0c;我们可以更好地了解系统的性能状况和内存管理情况。 命令及其结果 >>> vm_stat Mach Virtu…...

LeetCode:67.二进制求和

67. 二进制求和 - 力扣&#xff08;LeetCode&#xff09; 又是一道求和题&#xff0c;% / 在求和的用途了解了些&#xff0c; 目录 题目&#xff1a; 思路分析&#xff1a; 博主代码: 官方代码&#xff1a; 每日表情包&#xff1a; 题目&#xff1a; 思路分析&#xf…...

修改GI文件的权限

参考文档&#xff1a; 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刷题:杨氏矩阵【建议收藏】

看见这个题目&#xff0c;很多人的第一反应是遍历整个数组查找数字&#xff0c;但是这种方法不仅效率低&#xff0c;而且远远不能满足题目要求。下面介绍一种高效的查找方法&#xff1a; 代码实现&#xff1a; #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加锁实现方式

思考 是否有官方推荐&#xff08;自己先思考如何实现&#xff0c;然后再参考其他人的实践&#xff0c;总结优缺点&#xff09;通过哪些方式可以实现锁锁是否具有原子性锁请求失败了如何处理如果避免发生死锁如果避免发生资源抢占如果避免锁的误删 官方实现策略 安全性能&#…...

ClickHouse--08--SQL DDL 操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 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主题&#xff0c;也可以是免费的&#xff0c;可以在线免费下载。 https://www.wpniu.com/themes/288.html wordpress免费主题 高端大气的wordpress免费主题&#xff0c;LOGO在顶部左侧&#xff0c;导航菜单在顶部右侧。 ht…...

「数据结构」哈希表2:实现哈希表

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;Java数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 实现哈希表 &#x1f349;扩容&#x1f349;插入&#x1f349;获取value&#x1f349;源码 &#x1f349;扩容 在讲插入之前需要…...

ITK 图像分割(一):阈值ThresholdImageFilter

效果&#xff1a; Video: 区域增加分割 1、itkThresholdImageFilter 该类的主要功能是通过设置低阈值、高阈值或介于高低阈值之间&#xff0c;则将图像值输出为用户指定的值。 如果图像值低于、高于或介于设置的阈值之间&#xff0c;该类就将图像值设置为用户指定的“外部”值…...

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工程&#xff0c;在窗体上放一个文本框&#xff0c;一个列表框和三个按钮输入如下的代码&#xff1a; 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…...

浏览器内核的主要功能模块介绍

浏览器内核是浏览器的核心部分&#xff0c;负责解析网页内容、渲染页面和处理用户交互。一个典型的浏览器内核主要包括以下几个功能模块&#xff1a; 1. **解析器&#xff08;Parser&#xff09;**&#xff1a; 解析器负责解析网页内容&#xff0c;包括HTML…...

如何流畅进入Github

前言 以下软件是免费的&#xff0c;放心用 一、进入右边的下载链接https://steampp.net/ 二、点击下载 三、点击接受并下载 四、随便选一个下载链接进行下载 五、软件安装好打开后&#xff0c;找到Github 六、点击全部启用 七、再点击左上角的一键加速 八、这个时候你再进Git…...

docker磁盘不足!已解决~

目录 &#x1f35f;1.查看docker镜像目录 &#x1f9c2;2.停止docker服务 &#x1f953;3.创建新的目录 &#x1f32d;4.迁移目录 &#x1f37f;5.编辑迁移的目录 &#x1f95e;6.重新加载docker &#x1f354;7.检擦docker新目录 &#x1f373;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…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...