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(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文档遍历
bs = BeautifulSoup(html,"html.parser")
print(bs.a.contens)  # 返回a中的所有contens  列表形式 可以用列表遍历
print(bs.a.contens[2])
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.自己写方法查询

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())

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis集群模型

主从 全量同步 增量同步 哨兵 分片集群

【Linux】 网络编程套接字

目录 预备知识 网络字节序 网络字节序和主机字节序转换的库函数 socket编程接口 socket常见API sockaddr结构 套接字的种类 预备知识 1.在IP数据包头部中&#xff0c;有两个IP地址&#xff0c;分别叫做源IP地址和目的IP地址。 2.端口号&#xff1a;是传输层协议的内容…

Mac 版 Excel 和 Windows 版 Excel的区别

Excel是一款由微软公司开发的电子表格程序&#xff0c;广泛应用于数据处理、分析和可视化等领域。它提供了丰富的功能和工具&#xff0c;包括公式、函数、图表和数据透视表等&#xff0c;帮助用户高效地处理和管理大量数据。同时&#xff0c;Excel还支持与其他Office应用程序的…

【动态规划】【回文】【字符串】1278分割回文串 III

作者推荐 【动态规划】【前缀和】【C算法】LCP 57. 打地鼠 本文涉及知识点 动态规划汇总 LeetCode1278分割回文串 III 给你一个由小写字母组成的字符串 s&#xff0c;和一个整数 k。 请你按下面的要求分割字符串&#xff1a; 首先&#xff0c;你可以将 s 中的部分字符修改…

vscode配置wsl ubuntu c++的环境

在ubuntu安装llvm/clang sudo apt install llvm clang clangd lldb vscode的调试器接口是按GDB开发的&#xff0c;所以需要一个适配器&#xff0c;lldb-mi就是这个适配器。lldb-mi原来是llvm项目的一部分&#xff0c;后面成为了一个单独的项目https://github.com/lldb-tools/…

【笔记】Harmony学习:下载安装 DevEco Studio 开发工具IDE

IDE 安装 从官网下载DevEco Studio 安装包后进行安装&#xff0c; 安装完毕后&#xff0c;本地环境可能要配置相关工具&#xff0c;可以通过下面的诊断检测一下本地环境&#xff0c;通过蓝色“Set it up now” 可以快速安装。 1. Node.js (for ohpm) 2. ohpm 下载op的包管理&a…

移动Web——响应式网页

响应式网页是指能够根据用户设备的屏幕大小、分辨率和浏览器窗口大小等因素自动调整布局和显示效果的网页设计方式。 通过使用响应式设计技术&#xff0c;网页可以在不同的设备上提供一致的用户体验&#xff0c;无论是在桌面电脑、平板电脑还是手机等移动设备上访问网页都能够适…

python 基础知识点(蓝桥杯python科目个人复习计划35)

今日复习计划&#xff1a;阶段总结&#xff08;新年贺礼&#xff09; 1.python简介&#xff08;定义&#xff0c;优点&#xff0c;缺点&#xff0c;应用领域&#xff09; python&#xff1a;一种广泛使用的解释型&#xff0c;高级和通用的编程语言 python极简&#xff0c;生…

【51单片机】串口通信实验(包括波特率如何计算)

目录 串口通信实验通信的基本概念串行通信与并行通信异步通信与同步通信单工、 半双工与全双工通信通信速率 51单片机串口介绍串口介绍串口通信简介串口相关寄存器串口工作方式方式0方式1方式 2 和方式 3 串口的使用方法&#xff08;计算波特率&#xff09; 硬件设计软件设计1、…

C语言第二十二弹---指针(六)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 指针 1. 回调函数是什么&#xff1f; 2、qsort使用举例 2.1、使用qsort函数排序整型数据 2.2 使用qsort排序结构体数据 3、qsort函数的模拟实现 总结 1. 回…

机器学习---概率图模型(概率计算问题)

1. 直接计算法 给定模型和观测序列&#xff0c;计算观测序列O出现的概率。最直接 的方法是按概率公式直接计算.通过列举所有可能的长度为T的状态序列&#xff0c;求各个状 态序列 I 与观测序列的联合概率&#xff0c;然后对所有可能的状态序列求和&#xff0c;得 到。 状态…

【C++】多态语法概念

目录 一、概念及定义二、虚函数重写的特例三、final和override四、抽象类 一、概念及定义 概念&#xff1a;在继承关系下的不同类&#xff0c;调用同一个函数&#xff0c;产生不同的行为&#xff0c;叫作多态。 图示&#xff1a; 定义&#xff1a;必须通过基类的指针或者引…

代码随想录算法训练营第四十八天(动态规划篇之01背包)| 1049. 最后一块石头的重量Ⅱ,494. 目标和

1049. 最后一块石头的重量Ⅱ 题目链接&#xff1a;1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 思路 尽量将石头分为重量相同的两堆&#xff0c;这样两堆中的石头相撞之后剩下的石头就会最小。根据之前的01背包理论&#xff1a; 代码随想录算法训…

C语言easyx 贪吃蛇大作战,没有模仿,只有超越

作品名称:贪吃蛇大作战 版本历史和日期:V1.0 - 2024年2月11日 简介: 贪吃蛇大作战是一个基于EasyX图形库的经典贪吃蛇游戏。玩家通过键盘控制贪吃蛇的移动方向,目标是吃掉屏幕上随机生成的食物点,每吃掉一个食物点,蛇身就会增长一节。游戏提供三种模式:无屏障模式、有…

2024牛客寒假算法基础集训营2

C Tokitsukaze and Min-Max XOR 题目大意 给定一个数组从任取数构成序列序列满足&#xff0c;&#xff08;可以只取一个数&#xff09;问能构造出多少个 解题思路 定找双枚举时间复杂度到&#xff0c;考虑利用加速统计的方案&#xff0c;即将数字按二进制位拆分挂在树上对于…

vtk三维场景基本要素 灯光、相机、颜色、纹理映射 简介

整理一下VTK 三维场景基本要素&#xff0c;后面会一一进行整理&#xff1b; 1. 灯光 vtkLight 剧场里有各式各样的灯光&#xff0c;三维渲染场景中也一样&#xff0c;可以有多个灯光存在。灯光和相机 是三维渲染场景必备的要素&#xff0c;vtkRenderer会自动创建默认的灯光和…

第76讲安全退出实现

安全退出实现 VueX 是一个专门为 Vue.js 应用设计的状态管理构架&#xff0c;统一管理和维护各个vue组件的可变化状态(你可以理解成 vue 组件里的某些 data )。 Vuex有五个核心概念&#xff1a; state, getters, mutations, actions, modules。 state&#xff1a;vuex的基本数…

Blazor 子组件交互例子

源码 子组件 SwitchBar.razor &#xfeff;using Microsoft.Extensions.Logging inject ILogger<Index> Logger<div style"ClassString" onclick"OnClick">ChildContent </div>code {[Parameter]public RenderFragment? ChildContent…

element ui表格手写拖动排序

效果图&#xff1a; 思路&#xff1a; 重点在于&#xff1a;拖动行到某一位置&#xff0c;拿到这一位置的标识&#xff0c;数据插入进这个位置 vueuse的拖拽hooks useDraggable 可以用&#xff1b;html5 drag能拖动行元素&#xff1b;mounsedown、mounsemove时间实现拖拽 页…

嵌入式电子产品开发感悟!

​ 2023特别深有感触的有以下几个事件&#xff1a; 1. 早在2月底就提交报告&#xff1a;抓紧开一款便携式的空气波压力按摩仪外壳&#xff0c;包括模具费和100台试产物料费用总计不超过22W&#xff0c;保证最迟在4月中旬全部生产好&#xff0c;以供业务参加5月份开始的大健康展…