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

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'])

 

 

 

 

相关文章:

python-网络爬虫.BS4

BS4 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库, 它能够通过你喜欢的转换器实现惯用的文档导航、查找、修改文档的方 式。 Beautiful Soup 4 官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ 帮助手册&…...

C# 开发规范

控件命名规则 控件名简写 控件名简写LabellblTextBoxtxtButtonbtnLinkButtonlnkbtnImageButtonimgbtnDropDownListddlListBoxlstDataGriddgDataListdlCheckBoxchkCheckBoxListchklsRadioButtonrdoRadioButtonListrdoltImageimgPanelpnlCalendecldAdRotatorarTabletblRequiredF…...

【uniapp 样式】使用setStorageSync存储历史搜索记录

<template><view><view class"zhuangbox u-flex"><u--inputplaceholder"请输入关键字搜索"border"surround"shapecircleprefixIcon"search"prefixIconStyle"font-size: 22px;color: #909399"v-model&q…...

git remote add origin详解

git remote add origin详解_笔记大全_设计学院 一、git remote add origin的基础 使用“git remote add origin”指令&#xff0c;可以轻松地将本地项目连接到远程Git仓库 二、git remote add origin的用法 “git remote add origin”指令可以使用以下语法&#xff1a; git…...

附录1-将uni-app运行到微信开发者工具

目录 1 在manifest.json写入AppID 2 配置微信开发者工具的安装路径 3 微信开发者工具的安全设置 4 运行 5 修改一些配置项 1 在manifest.json写入AppID 2 配置微信开发者工具的安装路径 如果你忘了安装在哪里了&#xff0c;可以右键快捷方式看一下属性 在运行设置…...

【LeetCode】根据二叉树创建字符串

根据二叉树创建字符串 题目描述算法分析编程代码 链接: 根据二叉树创建字符串 题目描述 算法分析 当单纯的按照前序遍历输出后&#xff0c;我们只要对&#xff08;&#xff09;进行一些修改就好 编程代码 /*** Definition for a binary tree node.* struct TreeNode {* …...

【图论】强连通分量

一.定义 强连通分量&#xff08;Strongly Connected Components&#xff0c;简称SCC&#xff09;是图论中的一个概念&#xff0c;用于描述有向图中的一组顶点&#xff0c;其中任意两个顶点之间都存在一条有向路径。换句话说&#xff0c;对于图中的任意两个顶点u和v&#xff0c;…...

网络:VRP介绍

1. VRP 华为使用的通用路由平台&#xff0c;华为的交换机、防火墙、安全设备、无线和路由器的命令行几乎一样。 2. VRP分为用户视图、系统视图。 3. 用户视图 user view <Huawei>&#xff1a;其中<>代表的是用户视图&#xff0c;Huawei是设备的名称。命令比较少。…...

iOS - 解压ipa包中的Assert.car文件

项目在 Archive 打包后&#xff0c;生成ipa包 将 xxx.ipa文件修改为zip后缀即 xxx.zip &#xff0c;然后再双击解压&#xff0c;会生成一个 Payload 文件夹&#xff0c;里面一个文件 如下图&#xff1a; 然后显示改文件的包内容&#xff1a; 解压 Assets.car 文件的方式&…...

【Jmeter】配置不同业务请求比例,应对综合场景压测

目录 前言 Jmeter5.0新特性 核心改进 其他变化 资料获取方法 前言 Jmeter 5.0这次的核心改进是在许多地方改进了对 Rest 的支持&#xff0c;此外还有调试功能、录制功能的增强、报告的改进等。 我也是因为迁移到了Mac&#xff0c;准备在Mac上安装Jmeter的时候发现它已经…...

TCP拥塞控制详解 | 1. 概述

网络传输问题本质上是对网络资源的共享和复用问题&#xff0c;因此拥塞控制是网络工程领域的核心问题之一&#xff0c;并且随着互联网和数据中心流量的爆炸式增长&#xff0c;相关算法和机制出现了很多创新&#xff0c;本系列是免费电子书《TCP Congestion Control: A Systems …...

使用IPSEC VPN 在有防火墙的场景和有NAT转换的场景下实现隧道通信实验

目录 一、在有防火墙的场景 1、为所有设备配置对应ip地址&#xff1a; 2、进入两个防火墙实现公网互通 3、测试公网是否互通 4、进入SW1配置IPSEC VPN 5、进入SW2配置IPSEC VPN 6、配置策略方向ESP的流量 7、尝试使用PC1访问PC2 二、在有NAT地址转换的场景 1、为新增加…...

Go和Java实现适配器模式

Go和Java实现适配器模式 我们通过下面的实例来演示适配器模式的使用&#xff0c;其中&#xff0c;音频播放器设备只能播放 mp3 文件&#xff0c;通过使用一个更高级 的音频播放器来播放 vlc 和 mp4 文件。 1、适配器模式 适配器模式是作为两个不兼容的接口之间的桥梁。这种…...

接口相似数据结构复用率高?Apipost这招搞定!

在API设计和开发过程中&#xff0c;存在许多瓶颈&#xff0c;其中一个主要问题是在遇到相似数据结构的API时会产生重复性较多的工作&#xff1a;在每个API中都编写相同的数据&#xff0c;这不仅浪费时间和精力&#xff0c;还容易出错并降低API的可维护性。 为了解决这个问题&a…...

【零基础学Rust | 基础系列 | Hello, Rust】编写并运行第一个Rust程序

文章目录 前言一&#xff0c;创建项目二&#xff0c;两种编译方式1. 使用rustc编译器编译2. 使用Cargo编译 总结 前言 在开始学习任何一门新的编程语言时&#xff0c;都会从编写一个简单的 “Hello, World!” 程序开始。在这一章节中&#xff0c;将会介绍如何在Rust中编写并运…...

代理模式.

前言&#xff1a; 为什么要学习代理模式&#xff0c;因为AOP的底层机制就是动态代理&#xff01; 代理模式&#xff1a; 静态代理 动态代理 静态代理 抽象角色 : 一般使用接口或者抽象类来实现 真实角色 : 被代理的角色 代理角色 : 代理真实角色 ; 代理真实角色后 , 一…...

BS框架说明

B/S架构 1.B/S框架&#xff0c;意思是前端&#xff08;Browser 浏览器&#xff0c;小程序、app、自己写的&#xff09;和服务器端&#xff08;Server&#xff09;组成的系统的框架结构 2.B/S框架&#xff0c;也可理解为web架构&#xff0c;包含前端、后端、数据库三大组成部分…...

iOS——Block签名

首先来看block结构体对象Block_layout&#xff08;等同于clang编译出来的__Block_byref_a_0&#xff09; #define BLOCK_DESCRIPTOR_1 1 struct Block_descriptor_1 {uintptr_t reserved;uintptr_t size; };#define BLOCK_DESCRIPTOR_2 1 struct Block_descriptor_2 {// requi…...

Flutter 图片选取及裁剪

在开发项目里修改用户头像的功能&#xff0c;涉及到图片选取及裁剪&#xff0c;基本实现步骤如下&#xff1a; 1、pubspec.yaml 添加 image_picker: ^1.0.1 image_cropper: ^4.0.1&#xff1a; dependencies:image_picker: ^1.0.1image_cropper: ^4.0.1flutter:sdk: flutter…...

C语言每日一题:11.《数据结构》链表分割。

题目一&#xff1a; 题目链接&#xff1a; 思路一&#xff1a;使用带头链表 1.构建两个新的带头链表&#xff0c;头节点不存储数据。 2.循环遍历原来的链表。 3.小于x的尾插到第一个链表。 4.大于等于x尾插到第二个链表。 5.进行链表合并&#xff0c;注意第二个链表的尾的下一…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示&#xff0c;全球市场规模预计在 2031 年达到 9848 万美元&#xff0c;2025 - 2031 年期间年复合增长率&#xff08;CAGR&#xff09;为 3.7%。在竞争格局上&#xff0c;市场集中度较高&#xff0c;2024 年全球前十强厂商占据约 74.0% 的市场…...