python---------bs4爬取数据的一种神器

news2024/11/15 15:58:03

作者前言

 欢迎小可爱们前来借鉴我的gtieehttps://gitee.com/qin-laoda

目录

Beautiful Soup的简介
解析⼯具对⽐
BeautifulSoup的基本使⽤
解析器
搜索⽂档树
CSS常⽤选择器介绍
select和css选择器提取元素
_______________________________________________

前面我已经介绍了正则表达式,下面我们来介绍bs4

Beautiful Soup的简介

Beautiful Soup是python的⼀个库,最主要的功能是从⽹⻚抓取数据,

BeautifulSoup安装 pip install bs4

如图:

 我们来看看三种数据提取的方法

 本人建议还是使用xpath获取数据是比较好的,使用简单,本次介绍只是让各位知道方法有很多种,找到适合自己的就行

下面我提供一个网址里面有Beautiful Soup库的多种使用方向,而我们使用bs4就是要使用其中的搜索⽂档树

解析器

GitHub地址: https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
使用bs4和其他的获取数据的方法不同最主要的是要有 解析器 

如图:

 上面只是两个比较常用的,还有一些我没有列举出来,有兴趣的小可爱可以进入到我给的链接进行查看

如图:

下面的代码我是使用lxml解析器,
下面我写一段代码简单的介绍 BeautifulSoup的基本使⽤
我以爬取一页小说为例,网址http:// https://book.zongheng.com/chapter/1216709/68382502.html
代码:
 def parse_data(self,html):
        # 创建一个bs4对象
        soup = BeautifulSoup(html,"lxml")
        # 查看soup 对象的内容(格式化输出,会自动补全标签)
        # print(soup.prettify())
        # 获取title标签
        print(soup.title)
        print(type(soup.title))
        print(soup.title.string)
        print(soup.title.name)

结果:

这里我们简单的介绍一下

soup = BeautifulSoup(html,"lxml")

soup.title:获取title标签,返回一个bs4类

soup.title.string   获取title标签里面的文本

soup.title.name  获取title标签的名字(标签名字)

注意:这种方法只能获取第一个找到的标签,不能获取到所有的相同的标签

Beautiful Soup定义了很多搜索⽅法,这⾥着重介绍2个: find() 和 find_all() .其

它⽅法的参数和⽤法类似

find()

代码:

    def parse_data(self, html):

        # 创建一个bs4对象
        soup = BeautifulSoup(html,"lxml")
        print(soup.find("p"))
        print(type(soup.find("p")))
        print(soup.find("span",{"class":"con_txt"}))

结果:

find(): 获取第一个找到的标签,返回一个bs4对象 ,比较局限

soup.find("span",{"class":"con_txt"})获取到class="con_txt"的span标签

find_all()

代码:

 def parse_data(self, html):

        # 创建一个bs4对象
        soup = BeautifulSoup(html,"lxml")

        print(soup.find_all("p"))
        # 获取所有p标签
        print(type(soup.find_all("p")))
        # 获取所有p标签的前几个
        print(soup.find_all("p",limit=2))

        # 每个p标签的文本
        for p in soup.find_all("p"):
            print(p.string)

        # .获取所有class等于con_txt的span标签
        print(soup.find_all("span",{"class":"con_txt"}))
        print(soup.find_all("span",class_="con_txt"))

        # 将所有div的id="OrderConfirmDialog_close"和class="ui_widget_close"提取出来
        print(soup.find_all("div",{"id":"OrderConfirmDialog_close","class":"ui_widget_close"}))

结果(一部分) 

find_all() 返回一个列表,列表元素是bs4对象,
soup.find_all("p",limit=2) 获取所有p标签中的前两个

获取属性值的方法

代码:

 def parse_data(self, html):
        # 创建一个bs4对象
        soup = BeautifulSoup(html, "lxml")
        
        print(soup.find_all("div", {"id": "OrderConfirmDialog_close"})[0].get("class"))
        print(soup.find_all("div", {"id": "OrderConfirmDialog_close"})[0].attrs.get("class"))
        print(soup.find_all("div", {"id": "OrderConfirmDialog_close"})[0]["class"])
结果:

 .get() 和.attrs.get()的区别就是attrs.get()能防止报错

上面第三种方法和字典类似,

获取文本的方法

代码:

  def parse_data(self, html):
        # 创建一个bs4对象
        soup = BeautifulSoup(html, "lxml")

        # print(soup.find_all("div",{'class':"content"}))
        for i in soup.find_all("div",{'class':"content"}):
            print(i.string)
            print(i.strings)
            print(i.get_text())
            print(i.stripped_strings)

结果

可以看出
string获取文本
strings获取所有文本,返回一个对象,我们还需要转换成list
.get_text()获取所有文本,返回字符串
stripped_strings 获取所有文本并去掉空格,返回一个对象,我们还需要转换成list,和strings的区别就是去空格

 

CSS常⽤选择器介绍

代码(html):

<style type="text/css">
 # 选择p标签
 p{
 background-color:red;
 }
 # 根据class选择p标签
 .line1{
 background-color:pink;
 }
 #line3{
 background-color:blue;
 }
 # div下⾯的p标签
 .box p{
 background-color:pink;
 }
 # 选择div class下⾯直接的p标签
 .box > p {
 background-color:pink;
 }
 # 选择name=username的input标签
 input[name="username"]{
 background-color:pink;
 }
 </style>

上面是html代码的类型定义   .代表class    # 代码id

select和css选择器提取元素

代码

    def parse_data(self, html):
        # 创建一个bs4对象
        soup = BeautifulSoup(html, "lxml")
        soup.select("p")
        # 通过标签名获取
        print(soup.select("p"))

        # 通过类名的来获取标签
        print(soup.select(".con_txt"))

        # 通过id名来获取标签
        print(soup.select("#OrderConfirmDialog_close"))

        # 组合查找
        print(soup.select("div#OrderConfirmDialog_close"))
        print(soup.select("p .con_txt"))
        print(soup.select("p span.con_txt"))

利用select来查找数据要懂属于它的语法

我来讲讲组合查找,

"div#OrderConfirmDialog_close":找到id=OrderConfirmDialog_close的div的标签

"p .con_txt" :找到 class=con_txt的 p标签及p标签里面的其他标签

"p span.con_txt" 找到p标签下class=con_txt的span标签

select()返回的都是列表

全部代码:

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver import ChromeOptions


class Zongheng(object):
    def __init__ (self):
        pass

    def parse_url(self,url):

        option = ChromeOptions()
        option.add_experimental_option('excludeSwitches', ['enable-automation'])
        # 创建一个浏览器
        self.driver = webdriver.Chrome(executable_path='E:/python1/chromedriver', options=option)
        # 如何实现让selenium规避被检测的⻛险
        self.driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": """
                 Object.defineProperty(navigator, 'webdriver', {
                 get: () => undefined
                 })
                 """
        })
        # js 过检
        self.driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
        # 打开网址
        self.driver.get(url)

    # def parse_data(self,html):
    #     # 创建一个bs4对象
    #     soup = BeautifulSoup(html,"lxml")
    #     # 查看soup 对象的内容(格式化输出,会自动补全标签)
    #     # print(soup.prettify())
    #     soup.find()
    #     # 获取title标签
    #     print(soup.title)
    #     print(type(soup.title))
    #     print(soup.title.string)
    #     print(soup.title.name)


    # def parse_data(self, html):
    #
    #     # 创建一个bs4对象
    #     soup = BeautifulSoup(html,"lxml")
    #     print(soup.find("span",{"class":"con_txt"}))
    #     print(type(soup.find("span",{"class":"con_txt"})))


    # def parse_data (self, html):
    #
    #     # 创建一个bs4对象
    #     soup = BeautifulSoup(html, "lxml")
    #
    #     print(soup.find_all("p"))
    #     # 获取所有p标签
    #     print(type(soup.find_all("p")))
    #     # 获取所有p标签的前几个
    #     print(soup.find_all("p", limit=2))
    #
    #     # 每个p标签的文本
    #     for p in soup.find_all("p"):
    #         print(p.string)
    #
    #     # .获取所有class等于con_txt的span标签
    #     print(soup.find_all("span", {"class": "con_txt"}))
    #     print(soup.find_all("span", class_="con_txt"))
    #
    #     # 将所有div的id="OrderConfirmDialog_close"和class="ui_widget_close"提取出来
    #     print(soup.find_all("div", {"id": "OrderConfirmDialog_close", "class": "ui_widget_close"}))


    # def parse_data(self, html):
    #     # 创建一个bs4对象
    #     soup = BeautifulSoup(html, "lxml")
    #
    #     print(soup.find_all("div", {"id": "OrderConfirmDialog_close"})[0].get("class"))
    #     print(soup.find_all("div", {"id": "OrderConfirmDialog_close"})[0].attrs.get("class"))
    #     print(soup.find_all("div", {"id": "OrderConfirmDialog_close"})[0]["class"])


    # def parse_data(self, html):
    #     # 创建一个bs4对象
    #     soup = BeautifulSoup(html, "lxml")
    #
    #     # print(soup.find_all("div",{'class':"content"}))
    #     for i in soup.find_all("div",{'class':"content"}):
    #         print(i.string)
    #         print(list(i.strings))
    #         print(i.get_text())
    #         print(i.stripped_strings)


    def parse_data(self, html):
        # 创建一个bs4对象
        soup = BeautifulSoup(html, "lxml")
        soup.select("p")
        # 通过标签名获取
        print(soup.select("p"))

        # 通过类名的来获取标签
        print(soup.select(".con_txt"))

        # 通过id名来获取标签
        print(soup.select("#OrderConfirmDialog_close"))

        # 组合查找
        print(soup.select("div#OrderConfirmDialog_close"))
        print(soup.select("p .con_txt"))
        print(soup.select("p span.con_txt"))











    def main (self):
        """主要的业务逻辑"""
        # url
        url = "https://book.zongheng.com/chapter/1216709/68382502.html"
        header = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"

        }

        # 发送请求获取响应
        self.parse_url(url)
        # print(self.driver.page_source)
        html=self.driver.page_source


        # 数据的提取
        self.parse_data(html)

        # 保存


if __name__ == '__main__':
    zongheng = Zongheng()
    zongheng.main()

这里我就不讲保存了,后面xpath会讲

总结

以上就是我所讲的内容,如果想要bs4爬取网址的代码可以进入我的giteehttps://gitee.com/qin-laoda

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MongoDB快速实战与基本原理-01

一、MongoDB介绍 1、什么是MongoDB MongoDB是 一个文档数据库&#xff08;以 JSON 为数据模型&#xff09; &#xff0c;由C语言编写&#xff0c;旨在 为 WEB应用提供可扩展的高性能数据存储解决方案。 文档来自于“ JSON Document”&#xff0c;并非我们一般理解的 PDF&am…

Nik Color Efex 滤镜详解(2/5)

交叉冲印 Cross Processing 提供多种选项来处理 C41 - E6&#xff08;用幻灯片显影液处理彩色底片&#xff09;和 E6 - C41&#xff08;用彩色底片显影液处理幻灯片&#xff09;。 方法 Method 选择预设。 强度 Strength 控制滤镜效果程度。 黑暗对比度 Dark Contrasts 使用新…

这本书解开了我心中多年的疑惑,也推荐给你

我对地理一直比较感兴趣&#xff0c;中学时知识掌握的比较扎实&#xff0c;分得清洋流走向、季风信风、世界渔场等等&#xff0c;长期闲置不用已经遗忘的差不多。当时看地理真的是地理&#xff0c;现在看地理&#xff0c;不单单只是地理&#xff0c;还有政治、军事、经济、文化…

港科夜闻|香港科大工学院陈浩教授获选2023年亚洲青年科学家

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大工学院陈浩教授获选2023年亚洲青年科学家。亚洲青年科学家基金项目于2022年推出&#xff0c;是一项私人资助的研究奖学金计划&#xff0c;旨在鼓励和支持亚洲区内的青年科学家进行推动变革的创新研究&#xff0c…

springCloudAlibaba组件-Nacos-服务注册与心跳机制(二)

文章目录 nacos服务注册流程图专业术语服务注册执行流程 nacos服务注册流程图 专业术语 1.服务注册&#xff1a;为了将所有的微服务都方便管理&#xff0c;需要将自身的信息&#xff08;ip地址、端口号、服务名称&#xff09;以http请求方式调用nacos注册中心接口都放到nacos服…

有趣的数学 求和符号Σ (sigma)简述

一、简单相加 符号∑&#xff08;sigma&#xff09;通常用于表示多个项的总和。这个符号通常伴随着一个索引&#xff0c;该索引变化以包含总和中必须考虑的所有术语。 例如&#xff0c;݊第一个整数的和可以用以下方式表示&#xff1a; 或者&#xff0c;这两种表示意思都是一样…

【JS】中 ?.、??、??= 的用法和含义

今天分享几个处理空值简单的方法&#xff0c;避免使用三目运算、与或、if else时增加冗余的代&#xff0c;希望对大家有帮助。 可选链(?.) let a; let b a.?age; 含义&#xff1a; 可选链&#xff0c;只有当a存在,同时 a 具有 age 属性的时候,才会把值赋给b,否则就会将 u…

【FPGA入门】第二篇、ISE软件的使用

目录 第一部分、新建工程 第二部分、添加顶层文件 第三部分、添加管脚约束文件 第四部分、生成bit文件 第五部分、连接开发板&#xff0c;下载bit文件 第六部分、总结 第一部分、新建工程 第一步、如果提前建立了工程文件夹&#xff0c;那么这里就需要去掉生成子文件夹的…

字符串--const类型限定符、字符处理函数(修改首字母的大小写)、数值字符串向数值得转换

目录 一、const类型限定符 二、字符处理函数 三、数值字符串向函数值转换 一、const类型限定符 通过采用指针或数组作函数参数&#xff0c;可使调用者获得修改后的数据&#xff0c;但有时我们只希望将数据传到被调函数的内部&#xff0c;而并不希望它们在函数内被修改&…

Spring6 JdbcTemplate和事务

文章目录 1、JdbcTemplate1.1、简介1.2、准备工作1.3、实现CURD①装配 JdbcTemplate②测试增删改功能③查询数据返回对象④查询数据返回list集合⑤查询返回单个的值 2、声明式事务概念2.1、事务基本概念①什么是事务②事务的特性 2.2、编程式事务2.3、声明式事务 3、基于注解的…

AI无处不在,科技改变生活:开放原子全球开源峰会参会感悟

目录 前言 英特尔的开源之路 拥抱人工智能 AIGC的浪潮之巅 全链路AI解决方案 极致性能优化 结束语 前言 2023年开放原子全球开源峰会 目前中国源代码贡献量已达到世界第二&#xff0c;开源软件开发者数量也已突破800万&#xff0c;居全球第二。在众多开发者的关注下&…

2.部署Keystone服务

在OpenStack的框架体系中Keystone的作用类似于一个服务总线&#xff0c;为OpenStack提供身份管理服务&#xff0c;包括用户认证&#xff0c;服务认证和口令认证&#xff0c;其他服务通过Keystone来注册服务的Endpoint&#xff08;端点&#xff09;&#xff0c;针对服务的任何调…

50 最佳实践-安全最佳实践-Libvirt鉴权

文章目录 50 最佳实践-安全最佳实践-Libvirt鉴权50.1 简介50.2 开启libvirt鉴权50.3 管理SASL 50 最佳实践-安全最佳实践-Libvirt鉴权 50.1 简介 用户使用libvirt远程调用功能时&#xff0c;如果不进行任何鉴权校验&#xff0c;所有连接到主机所在网络的第三方程序都可以通过…

一道北大强基题背后的故事(四)——数学之美,美在哪里?

早点关注我&#xff0c;精彩不错过&#xff01; 在前面文章中&#xff0c;我们重点聊了[((1 sqrt(5)) / 2) ^ 12]这道题可能的弯路&#xff0c;出题思路和这道题设计巧妙的结论&#xff0c;相关内容请戳&#xff1a; 一道北大强基题背后的故事&#xff08;三&#xff09;——什…

MTK 平台相机bringup流程

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、Camera 框架介绍二、Camera Bringup 需要配置的文件三、复盘总结 一、Camera 框架介绍 Camera 的框架分为 Kernel 部分和 hal 部分&#xff0c;其中…

需求分析引言:架构漫谈(一)

本文主要对架构的概念做一些介绍&#xff0c;并引申出需求分析的重要性。 后续准备做一个系列&#xff0c;定期介绍我工作以来的一些需求实现的案例。 注&#xff1a;因为架构的内容比较庞大&#xff0c;里面的每个点&#xff0c;都可以扩展成一系列的文章&#xff0c; 因此&am…

基于Java精品酒销售管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

PoseiSwap 即将在 6 月 18 日开启 IDO,白名单申请者超 14000 人

根据PoseiSwap官方公告&#xff0c;PoseiSwap正式确定了将在6月18日0&#xff1a;00&#xff08;UTC&#xff09;正式在Bounce上开启IDO活动&#xff0c;目前本次活动的白名单申请用户已经突破了14000人。除了Bounce外&#xff0c;PoseiSwap将陆续在BitForex&#xff08;6月23日…

uniapp + vue3 + uviewPlus 搭建多端项目框架

随着vite.js越来越受开发者青睐&#xff0c;很多大厂的项目都偏向于vue3开发&#xff0c;想着uniapp搭配vite4.x搭建多端项目效果会怎么样&#xff1f;经过一番实践发现果然不错&#xff01; 版本信息 HBuilderX: 3.8.4 Vite: 4.2.1 uView-Plus: 3.1.31初始化uniappvue3项目 …

PSINS工具箱学习(一)下载安装初始化、SINS-GPS组合导航仿真、习惯约定与常用变量符号、数据导入转换、绘图显示

文章目录 一、前言二、相关资源三、下载安装初始化1、下载PSINSyymmdd.rar工具箱文件2、解压文件3、初始化4、启动工具箱导览 四、习惯约定与常用变量符号1、PSINS全局变量结构体 glv2、坐标系定义3、姿态阵/姿态四元数/欧拉角 Cnb/qnb/att4、IMU采样数据 imu5、AVP导航参数 av…