python-网络爬虫.BS4

BS4

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库, 它能够通过你喜欢的转换器实现惯用的文档导航、查找、修改文档的方 式。

Beautiful Soup 4

官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

帮助手册:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/

一、安装Beautiful Soup

命令行:pip3 install beautifulsoup4

或者:

File--》setting--》Project:xxx--》右侧 “+” ==》查找 Bs4 ==》左下角

install ==>apply ==>确定

二、安装解析器lxml (第三方的解析器,推荐用lxml,速度快,文档容错能 力强)

        pip3 install lxml

三、使用

        创建bs对象

# 打开本地HTML文件的方式来创建对象

        soup = BeautifulSoup(open('xxxx.html')) # 创建Beautiful Sou对象

#打开网上在线HTML文件

        url = 'https://jobs.51job.com/ruanjian/'

        wb_data = requests.get(url)

        soup = BeautifulSoup(wb_data.text, 'lxml')

        其中

                soup = BeautifulSoup(html, "lxml")         # 指定lxml解析器

        或者

        soup = BeautifulSoup(url, 'html.parser')         # 内置默认html解析器

         格式化输出soup对象内容

        print(soup.prettify())

        

        四大对象:

        Beautiful Soup将复杂HTML文档转换成一个不复杂的树形结构,

        每个节点都是Python对象,所有对象可以归纳为4种:

        Tag                                         标签                                 bs4.element.Tag

        NavigableString                    字符串                                bs4.element.NavigableString         BeautifulSoup                      整体页面                             bs4.BeautifulSoup

        Comment                                注释                                 bs4.element.Comment

 

 Tag:是HTML 中的一个个标签

上面的 title a 等等 HTML 标签加上里面包括的内容就是 Tag。

一般标签都是成对出现,结尾的有 /标示

下面用 Beautiful Soup 来方便地获取 Tags print soup.title

 对于 Tag,它有两个重要的属性,是 name 和 attrs

print soup.name

print soup.head.name

#[document]

#head

soup 对象本身比较特殊,它的 name 即为 [document],

对于其他内部标签,输出的值便为标签本身的名称。

print soup.p.attrs

#{'class': ['title'], 'name': 'dromouse'}

如果我们想要单独获取某个属性,可以这样,例如我们获取它的 class 叫什 么

print soup.p['class']

#['title']

还可以这样,利用get方法,传入属性的名称,二者是等价的

print soup.p.get('class')

#['title']

NavigableString: ##可以遍历的字符串

既然我们已经得到了标签的内容,那么问题来了,

我们要想获取标签内部的文字怎么办呢?很简单,用 .string 即可,

例如:

print soup.p.string

#The Dormouse's story

检查一下它的类型

print type(soup.p.string)

 

BeautifulSoup                 ##表示的是一个文档的全部内容.大部分时候,

                                        可以把它当作 Tag 对象,是一个特殊的 Tag

获取它的类型,名称,以及属性

print type(soup.name)

 

print soup.name

#[document]

print soup.attrs

#{} 空字典

Comment         ##特殊类型的 NavigableString 对象,输出的内容仍然不包 括注释符号

print soup.a

print soup.a.string

print type(soup.a.string)

运行结果如下

 

其他操作: 遍历文档树 以head标签为例

# .content 属性可以将tag的子节点以列表的方式输出

print(soup.head.contents)

 

print(soup.head.contents[1])         # 获取列表中某一元素,0 是页面上的换行符 号,1才是真值

# .children 返回的是一个list生成器对象

print(soup.head.children)

 # .string 返回最里面的内容

 print(soup.head.string)

print(soup.title.string)         # 两个输出是一样的

搜索文档树 ==》find_all() select()

find_all(name, attrs, recursive, text, **kwargs)

# find用法相同,只返回一个

# name参数可以查找所有名字为 name 的tag,可以是字符串,正则表达 式,列表

print(soup.find_all('a'))

print(soup.find_all(["a" , "b"]))

#recursive 递归查找相同名称标签

# keyword参数直接匹配属性对应的值

print(soup.find_all(class_= "sister"))

        # 因为class在python中已经有了,为了防止冲突,所以是class_

print(soup.find_all(id= 'link2'))

# text参数搜索文档中的字符串内容,与name参数的可选值一样,text参数 接受字符串,正则表达式,列表

print(soup.find_all(text= "Elsie")) #严格匹配

print(soup.find_all(text=["Tillie" , "Elsie" , "Lacie"])) #找多个

print(soup.find_all(text=re.compile("Dormouse"))) #正则查找

五:使用演练

以实际例子作说明:

1、定义一个html,并使用BeautifulSoup的lxml解析

 

 

2、获取所有的tr标签

find 返回找到的第一个标签,find_all以list的形式返回找到的所有标签

trs = soup.find_all('tr')         # 返回列表

n=1

for i in trs:

        print('第{}个tr标签: '.format(n))

        print(i)

         n+=1

3、获取第二个tr标签

limit 可指定返回的标签数量

trs = soup.find_all('tr' ,limit=2)[1]         # 从列表中获取第二个元素,limit 获取 标签个数

print(trs)

4、获取class= 'a1'的tr标签

a.方法一: class_

trs = soup.find_all('tr' ,class_= 'a1')

n=1

for i in trs:

        print('第{}个class=''a1''的tr标签:'.format(n))

        print(i)

        n+=1

b.方法二:attrs 将标签属性放到一个字典中

trs = soup.find_all('tr',attrs={'class':'a1'})

n=1

for i in trs:

        print('第{}个class=''a1''的tr标签:'.format(n))

         print(i)

        n+=1

5、提取所有id= 'test'且class= 'test'的a标签

方法一:class_

alist = soup.find_all('a' ,id= 'test' ,class_= 'test')

n=1

for i in alist:

        print('第{}个id= ''test''且class= ''test''的a标签: '.format(n))

        print(i)

        n+=1

 方法二:attrs

alist = soup.find_all('a' ,attrs={'id':'test' , 'class':'test'})

n=1

for i in alist:

         print('第{}个id= ''test''且class= ''test''的a标签: '.format(n))

        print(i)

        n+=1

6、获取所有a标签的href属性

alist = soup.find_all('a')

#方法一:通过下标获取

for a in alist:

        href = a['href']

         print(href)

#方法二: 通过attrs获取

for a in alist:

        href = a.attrs['href']

        print(href)

7、获取所有的职位信息(所有文本信息)

string 获取标签下的非标签字符串(值), 返回字符串

注:第一个tr为标题信息,不获取。从第二个tr开始获取。

trs = soup.find_all('tr')[1:]

movies = []

for tr in trs:

        move = {}

        tds = tr.find_all('td')

        move['td1'] = tds[0].string         # string 取td的值

        move['td2'] = tds[1].string

        move['td3'] = tds[2].string

        movies.append(move)

print(movies)

8、获取所有非标记性字符

strings 获取标签下的所有非标签字符串, 返回生成器。

trs = soup.find_all('tr')[1:]

for tr in trs:

         infos = list(tr.strings)         # 获取所有非标记性字符,包含换行、空格

        print(infos

9、获取所有非空字符

stripped_strings 获取标签下的所有非标签字符串,并剔除空白字符,返回 生成器。

trs = soup.find_all('tr')[1:]

for tr in trs:

        infos = list(tr.stripped_strings)         # 获取所有非空字符,不包含换行、空 格

        print(infos)

# stripped_strings 获取所有职位信息

trs = soup.find_all('tr')[1:]

movies = []

for tr in trs:

        move = {}

        infos = list(tr.stripped_strings)

        move['职位'] = infos[0]

        move['类别'] = infos[1]

         move['时间'] = infos[2]

        movies.append(move)

print(movies)

10、get_text 获取所有职位信息

get_text 获取标签下的所有非标签字符串,返回字符串格式

trs = soup.find_all('tr')[1]

text = trs.get_text() # 返回字符串格式

print(text)

 

14、提取所有a标签的href属性

# 方法一:

a = soup.select('a')

for i in a:

        print(i['href'])

# 方法二:

a = soup.select('a')

for i in a:

         print(i.attrs['href'])

 

 

 

 

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

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

相关文章

【element-ui】form表单初始化页面如何取消自动校验rules

问题描述:elementUI表单提交页面,初始化页面是获取接口数据,给form赋值,但是有时候这些会是空值情况,如果是空值,再给form表单赋值的话,页面初始化时候进行rules校验会不通过,此时前…

在excel中整理sql语句

数据准备 CREATE TABLE t_test (id varchar(32) NOT NULL,title varchar(255) DEFAULT NULL,date datetime DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; INSERT INTO t_test VALUES (87896cf20b5a4043b841351c2fd9271f,张三1,2023/6/8 14:06); INSERT INTO t_test …

单元测试之 - Spring框架提供的单元/集成测试注解

Spring框架提供了很多注解来辅助完成单元测试和集成测试(备注:这里的集成测试指容器内部的集成测试,非系统间的集成测试),先看看Spring框架提供了哪些注解以及对应的作用。RunWith(SpringRunner.class) / ExtendWith(SpringExtension.class)&…

python与深度学习(十一):CNN和猫狗大战

目录 1. 说明2. 猫狗大战2.1 导入相关库2.2 建立模型2.3 模型编译2.4 数据生成器2.5 模型训练2.6 模型保存2.7 模型训练结果的可视化 3. 猫狗大战的CNN模型可视化结果图4. 完整代码5. 猫狗大战的迁移学习 1. 说明 本篇文章是CNN的另外一个例子,猫狗大战&#xff0c…

风辞远的科技茶屋:来自未来的信号枪

很久之前,有位朋友问我,现在科技资讯这么发达了,你们还写啊写做什么呢? 我是这么看的。最终能够凝结为资讯的那个新闻点,其实是一系列事情最终得出的结果,而这个结果又会带来更多新的结果。其中这些“得出”…

基于改进粒子群算法的混合储能系统容量优化(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 文献来源 🌈4 Matlab代码及文章讲解 ​ 💥1 概述 摘要: 为了调高风光互补发电储能系统的经济性,减少其运行费用,研究风光互补发电储能系统的容量优化配置模型&…

Nginx配置WebSocket反向代理

1、WebSocket协议 ​ WebSocket协议相比较于HTTP协议成功握手后可以多次进行通讯,直到连接被关闭。但是WebSocket中的握手和HTTP中的握手兼容,它使用HTTP中的Upgrade协议头将连接从HTTP升级到WebSocket。这使得WebSocket程序可以更容易的使用现已存在的…

云曦暑期学习第三周——ctfshow--php特性(89-104)

目录 web89 preg_match函数 、数组 web90 intval()函数、强比较 web91 正则修饰符 web92 intval()函数、弱比较 web93 八进制、小数点 web94 strpos() 函数、小数点 web95 小数点 web96 highlight_file() 下的目录路径 web97 数组 web98 三目运算符 web9…

iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动

iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动 在之前的开发中,遇到了实时音视频呼叫通知,当App未打开或者App在后台时候,需要通知到用户,用户点击通知栏后是否接入实时音视频的视频或者音频通话。 在…

深度学习技巧应用24-深度学习手撕代码与训练流程的联系记忆方法

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用24-深度学习手撕代码与训练流程的联系记忆方法,大家都知道深度学习模型训练过程是个复杂的过程,这个过程包括数据的收集,数据的处理,模型的搭建,优化器的选择,损失函数的选择,模型训练,模型评估等步骤,其中缺少…

1. CUDA中的grid和block

1. CUDA中的grid和block基本的理解 Kernel: Kernel不是CPU,而是在GPU上运行的特殊函数。你可以把Kernel想象成GPU上并行执行的任务。当你从主机(CPU)调用Kernel时,它在GPU上启动,并在许多线程上并行运行。 Grid: 当你…

Android 之 MediaPlayer 播放音频与视频

本节引言: 本节带来的是Android多媒体中的——MediaPlayer,我们可以通过这个API来播放音频和视频 该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码 和播放音视频。它支持三种不同的…

Android 14重要更新预览

Android 14重要更新预览 国际化 Android 14 在 Android 13 的基础上进一步扩展了按应用设定语言功能,提供了一些额外的功能: 自动生成应用的 localeConfig:从 Android Studio Giraffe Canary 7 和 AGP 8.1.0-alpha07 开始,您可以…

分布式限流方案及实现

优质博文:IT-BLOG-CN 一、限流的作用和意义 限流是对高并发访问进行限制,限速的过程。通过限流来限制资源,可以提高系统的稳定性和可靠性,控制系统的负载,削峰填谷,保证服务质量。 服务限流后的常见处理…

【论文笔记】KDD2019 | KGAT: Knowledge Graph Attention Network for Recommendation

Abstract 为了更好的推荐,不仅要对user-item交互进行建模,还要将关系信息考虑进来 传统方法因子分解机将每个交互都当作一个独立的实例,但是忽略了item之间的关系(eg:一部电影的导演也是另一部电影的演员&#xff09…

【React】关于组件之间的通讯

🌟组件化:把一个项目拆成一个一个的组件,为了便与开发与维护 组件之间互相独立且封闭,一般而言,每个组件只能使用自己的数据(组件状态私有)。 如果组件之间相互传参怎么办? 那么就要…

[nlp] TF-IDF算法介绍

(1)TF是词频(Term Frequency) 词频是文档中词出现的概率。 (2) IDF是逆向文件频率(Inverse Document Frequency) 包含词条的文档越少,IDF越大。

Maven依赖管理

依赖特性: 1、依赖配置 2、依赖传递 3、可选依赖 4、排除依赖 5、依赖范围

linux(centos) docker 安装 nginx

​1、拉取nginx最新版本镜像 docker pull nginx:latest 查看镜像 docker images 或者 docker images -a 2.启动nginx容器 docker run -d -p 80:80 --name nginx nginx 使用docker run命令,启动nginx容器。 --name,设置容器名。为方便记忆&#xff…

监控数据的采集方式及原理

1、读取 /proc 目录 /proc 是一个位于内存中的伪文件系统,该目录下保存的不是真正的文件和目录,而是一些“运行时”信息,Linux 操作系统层面的很多监控数据,比如内存数据、网卡流量、机器负载等,都是从 /proc 中获取的…