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

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

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

相关文章

OpenCV-36 多边形逼近与凸包

目录 一、多边形的逼近 二、凸包 一、多边形的逼近 findContours后的轮廓信息countours可能过于复杂不平滑&#xff0c;可以用approxPolyDP函数对该多边形曲线做适当近似&#xff0c;这就是轮廓的多边形逼近。 apporxPolyDP就是以多边形去逼近轮廓&#xff0c;采用的是Doug…

Android9~Android13 某些容量SD卡被格式化为内部存储时容量显示错误问题的研究与解决方案

声明:原创文章,禁止转载! Android9~Android13 某些容量SD卡被格式化为内部存储时容量显示错误问题的研究与解决方案 分析Android11 系统对于EMMC/UFS作为内部存储、SD卡被格式化为内部存储、SD卡/U盘被格式化为便携式存储的不同处理 一.现象描述 实测Android9 Android10 A…

牛客错题整理——C语言(实时更新)

1.以下程序的运行结果是&#xff08;&#xff09; #include <stdio.h> int main() { int sum, pad,pAd; sum pad 5; pAd sum, pAd, pad; printf("%d\n",pAd); }答案为7 由于赋值运算符的优先级高于逗号表达式&#xff0c;因此pAd sum, pAd, pad;等价于(…

速度规划:s形曲线应用(变速 停车)opencv c++显示(3)

理论篇 先看该篇&#xff0c;这里沿用了里面的变量。 应用推导篇 分为变速和停车两部分&#xff08;字迹潦草&#xff0c;可结合代码看&#xff09; 代码篇 变速函数入口&#xff1a; velocityPlanner vp; vp.SetParameters(0, 1);停车函数入口&#xff1a; ParkingVelo…

6 scala-面向对象编程基础

Scala 跟 Java 一样&#xff0c;是一门面向对象编程的语言&#xff0c;有类和对象的概念。 1 类与对象 与 Java 一样&#xff0c;Scala 也是通过关键字 class 来定义类&#xff0c;使用关键字 new 创建对象。 要运行我们编写的代码&#xff0c;同样像 Java 一样&#xff0c;…

uniapp小程序端使用计算属性动态绑定style样式踩坑

踩坑点: 使用uniapp编译小程序端动态绑定复杂style使用计算属性方式&#xff0c;return必须返回json字符串格式&#xff0c;不能返回object&#xff0c;否则会不起作用。 代码总览 视图层 逻辑层&#xff08;注意这里是使用的计算属性哈&#xff09; 这里我封装成了一个个性化…

蓝桥杯嵌入式第9届真题(完成) STM32G431

蓝桥杯嵌入式第9届真题(完成) STM32G431 题目 分析和代码 main.h /* USER CODE BEGIN Header */ /********************************************************************************* file : main.h* brief : Header for main.c file.* …

Ubuntu Desktop - Terminal 输出全部选中 + 复制

Ubuntu Desktop - Terminal 输出全部选中 复制 1. Terminal2. Terminal 最大化3. Edit -> Select All4. Copy & PasteReferences 1. Terminal 2. Terminal 最大化 3. Edit -> Select All 4. Copy & Paste Edit -> Copy or Shift Ctrl C Edit -> Paste…

PV、UV、IP

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1. PV1.1 PV 计算1.2 PV 的影响因素 2. UV2.1 UV 计算2.2UV 的影响因素 3. IP3.1 IP和UV①UV大于IP②UV小于IP 三者的关系PV 和 UV 前言 PV、UV、IP是我们在运…

印度5G不是比中国先进,而是印度用户敢用,中国用户不敢用!

分析机构OpenSignal给出的数据指出中国手机用户的平均速率比印度用户还要低&#xff0c;这说明中国5G落后于印度&#xff0c;其实这是片面的说法&#xff0c;中国运营商的5G网络能力肯定强于印度运营商&#xff0c;但是中国用户不敢用&#xff0c;而印度用户敢用&#xff0c;这…

mysql经典4张表问题

1.数据库表结构关联图 2.问题&#xff1a; 1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数3.查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩4、查询名字中含有"风"字的学生信息5、查询课程名称为"数学"&…

java的excel列行合并模版

1.效果 2.模版 <tableborder"1"cellpadding"0"cellspacing"0"class"tablebor"id"TABLE"><tr align"center" class"bg217"><td style"background-color: #008000; color: #ffffff;p…

【初中生讲机器学习】6. 分类算法中常用的模型评价指标有哪些?here!

创建时间&#xff1a;2024-02-07 最后编辑时间&#xff1a;2024-02-09 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…

Web 扫描神器:Gobuster 保姆级教程(附链接)

一、介绍 Gobuster 是一款用于目录和文件枚举的开源工具。它主要用于在Web应用程序或网站上查找隐藏的目录和文件&#xff0c;从而进行信息收集或渗透测试。以下是 Gobuster 的一些主要特点和功能&#xff1a; 快速且高效&#xff1a; Gobuster 被设计为快速、高效的工具&…

第九个知识点:内部对象

Date对象: <script>var date new Date();date.getFullYear();//年date.getMonth();//月date.getDate();//日date.getDay();//星期几date.getHours();//时date.getMinutes();//分date.getSeconds();//秒date.getTime();//获取时间戳&#xff0c;时间戳时全球统一&#x…

【人工智能】神奇的Embedding:文本变向量,大语言模型智慧密码解析(10)

什么是嵌入&#xff1f; OpenAI 的文本嵌入衡量文本字符串的相关性。嵌入通常用于&#xff1a; Search 搜索&#xff08;结果按与查询字符串的相关性排序&#xff09;Clustering 聚类&#xff08;文本字符串按相似性分组&#xff09;Recommendations 推荐&#xff08;推荐具有…

牛客周赛 Round 32 F.小红的矩阵修改【三进制状态压缩dp】

原题链接&#xff1a;https://ac.nowcoder.com/acm/contest/75174/F 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 小红拿到了一个字符矩阵&#xff0c;矩阵中仅包含&q…

spring boot学习第十一篇:发邮件

1、pom.xml文件内容如下&#xff08;是我所有学习内容需要的&#xff0c;不再单独分出来&#xff0c;包不会冲突&#xff09;&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…

《CSS 简易速速上手小册》第3章:CSS 响应式设计(2024 最新版)

文章目录 3.1 媒体查询基础&#xff1a;网页的智能眼镜3.1.1 基础知识3.1.2 重点案例&#xff1a;适应三种设备的响应式布局3.1.3 拓展案例 1&#xff1a;改变字体大小3.1.4 拓展案例 2&#xff1a;暗模式适配 3.2 响应式图片和视频&#xff1a;让内容自由呼吸3.2.1 基础知识3.…

LeetCode周赛——384

1.修改矩阵&#xff08;模拟&#xff09; class Solution { public:vector<vector<int>> modifiedMatrix(vector<vector<int>>& matrix) {int n matrix.size();int m matrix[0].size();vector<int> ans(m);for(int i 0; i < m; i)for(…