09. bs4解析基础与实例

2023-11-05

目录

前言

bs4的安装

bs4使用基础

bs4实例——获取某网站菜价

代码实现

完整代码

重要提醒

总结


前言

我们已经具备了基本的HTML知识,能够简单的识别HTML源代码中的各类元素。这一节我们将正式学习bs4的用法,并用一个实例来展示它的方便之处。可以说,相比于正则法,bs4是非常简单的。


bs4的安装

没有安装过Python模块的同学可以参照我在requests章节的安装模块部分,把requests替换成bs4就可以了。

传送门:Python模块安装的三种方式

当然,大多数看到这一节的同学应该已经懂得模块的安装了,bs4模块安装如下:

pip install bs4 -i https://pypi.tuna.tsinghua.edu.cn/simple

bs4使用基础

BeautifulSoup对象获取html中的内容主要通过两个方法来完成:

  • find()
  • find_all() 

    不论是 find 还是 find_all,参数几乎是一致的 
  • 语法:find(标签, 属性=值)    意思是在页面中查找xxx标签,并且标签的xxx属性必须是xxx值

例如,find('div' , age=18) 含义就是在页面中查找div标签,并且属性age必须是18的这个标签

find_all() 用法和 find() 几乎一致。find() 查找一个,find_all() 查找页面中所有的。


bs4实例——获取某网站菜价

由已知可得,只要源代码中有数据,我们就能通过bs4轻松找到并提取出来。

目的:抓取某网站的菜价表并把所有信息输入到csv文件中。

代码实现

第一步,老规矩,先获取源代码

# 拿到页面源代码
url = "在评论区"
resp = requests.get(url)
# print(resp.text)

第二步,把页面源代码直接全部丢给BeautifulSoup进行预处理,就可以通过bs对象得到该页面的所有html标签了。

# 1. 生成bs对象
page = BeautifulSoup(resp.text, "html.parser")  # 指定html解析器

第三步,找到我们想要的菜价表位置

使用的是find函数。我们用的最多的就是前两个,第一个就是只找一个,第二个是查找所有的。

我们在源代码中可以看到,我们想要的菜价数据全部被包裹在<table>标签中,这意味着被包含在表格里。而表格是由<tr>和<td>组成的,也就是行与列。

这下思路就明确了:先定位到表格,再获得所有行,再把所有行中的数据依次存入csv文件。

首先查看源代码,定位表格:

可以看到表格标签中有一个属性值,并且是首次出现,那么我们就可以通过find精准的把他找出来 

# 2. 从bs对象中查找数据
# find(标签, 属性=值):找第一个
# find_all(标签, 属性=值):找全部

# table = page.find("table",class_="price-table")     # class是python中的关键字,加_以示区别
# 另一种写法:
table = page.find("table", attrs={"class": "price-table"})  # 和上一行是一个意思,此时可以避免class
# print(table)

下一步,定位所有行

# 不想要列名那一行(表头),只想要底下的数据,即拿到所有数据行
trs = table.find_all("tr")[1:]  # tr是行的意思

因为表格还存在表头,我们不想要的话就可以从第一行开始切片,这样就不会拿到表头了。

最后,遍历所有行,把其中的数据拿出来

for tr in trs:  # 每一行
    tds = tr.find_all("td")  # td表示单元格。拿到每行中的所有td
    # print(tds[0])
    # 名字、产地、均价(元/公斤)、规格、日期
    name = tds[0].text  # .text表示拿到被标签标记的内容
    place = tds[1].text
    avg_price = tds[2].text
    spec = tds[3].text
    date = tds[4].text
    # print(name,place,avg_price,spec,date)

    csvwriter.writerow([name, place, avg_price, spec, date])
    
f.close()
print("over!!!")

resp.close()

这样我们就顺利的把数据写入文件了。一定要记得要关闭文件并且关闭网络请求,这是一个好习惯,希望大家保持。


完整代码

# 安装
# pip install bs4 -i 清华

# 1. 拿到页面源代码
# 2. 使用bs4进行解析. 拿到数据
import requests
from bs4 import BeautifulSoup
import csv

# 拿到页面源代码
url = "在评论区"
resp = requests.get(url)
# print(resp.text)

f = open("广州江南菜价.csv", mode="w", newline="", encoding="utf-8")
csvwriter = csv.writer(f)

# 使用bs4解析数据(两步)
# 1. 生成bs对象
page = BeautifulSoup(resp.text, "html.parser")  # 指定html解析器

# 2. 从bs对象中查找数据
# find(标签, 属性=值):找第一个
# find_all(标签, 属性=值):找全部

# table = page.find("table",class_="price-table")     # class是python中的关键字,加_以示区别
# 另一种写法:
table = page.find("table", attrs={"class": "price-table"})  # 和上一行是一个意思,此时可以避免class
# print(table)

# 不想要列名那一行(表头),只想要底下的数据,即拿到所有数据行
trs = table.find_all("tr")[1:]  # tr是行的意思
for tr in trs:  # 每一行
    tds = tr.find_all("td")  # td表示单元格。拿到每行中的所有td
    # print(tds[0])
    # 名字、产地、均价(元/公斤)、规格、日期
    name = tds[0].text  # .text表示拿到被标签标记的内容
    place = tds[1].text
    avg_price = tds[2].text
    spec = tds[3].text
    date = tds[4].text
    # print(name,place,avg_price,spec,date)

    csvwriter.writerow([name, place, avg_price, spec, date])

f.close()
print("over!!!")

resp.close()

重要提醒

大家可以看到本例涉及的网站一共有一万多页,我们作为初学者一定不要盲目的去把所有数据都扒拿到!一个是没有什么用处,再一个是对网站服务器的负担很大,相当于搞破坏了,所以大家还是悠着点,适量的去试几页练手就好!当然也可以修改源代码里面的url部分或者套一个for循环来自动进行换页爬取。


总结

今天我们认识了bs4解析方式,也以一个实例进行训练,获取了某网站的菜价,明显感觉到bs4比起正则的简单与便捷。当然,我们也应铭记不要对网站进行高频词的访问,不然就类似于DDoS攻击了,对于网站服务器很不友好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

09. bs4解析基础与实例 的相关文章

  • Python 多处理示例不起作用

    我正在尝试学习如何使用multiprocessing但我无法让它发挥作用 这是代码文档 http docs python org 2 library multiprocessing html from multiprocessing imp
  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 按下回车键时不刷新页面

    我遇到了一些问题 只要表单中有输入 回车键就会触发页面刷新 下面的代码 如果按下回车并且文本区域 input 中没有输入任何文本 则不会刷新页面 但是如果按下回车并且 input中有输入或者光标位于文本区域 我不确定是什么触发了它 因为 s
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 从 scikit-learn 导入 make_blobs [重复]

    这个问题在这里已经有答案了 我收到下一个警告 D Programming Python ML venv lib site packages sklearn utils deprecation py 77 DeprecationWarning
  • 如何使用角度材料在具有可扩展行的表格中创建嵌套垫表

    我有以下数据 id c9d5ab1a subdomain wing domain aircraft part id c9d5ab1a info mimetype application json info dependent parent
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • 如何在模态打开时防止主体滚动

    我在用着W3schools 模态脚本 https www w3schools com howto tryit asp filename tryhow css modal我想添加一个功能 防止模型打开时整个主体滚动 我根据我的需要对原始脚本做
  • feedparser 在脚本运行期间失败,但无法在交互式 python 控制台中重现

    当我运行 eclipse 或在 iPython 中运行脚本时 它失败了 ascii codec can t decode byte 0xe2 in position 32 ordinal not in range 128 我不知道为什么 但
  • 当玩家触摸屏幕一侧时,如何让 pygame 发出警告?

    我使用 pygame 创建了一个游戏 当玩家触摸屏幕一侧时 我想让 pygame 给出类似 你不能触摸屏幕两侧 的错误 我尝试在互联网上搜索 但没有找到任何好的结果 我想过在屏幕外添加一个方块 当玩家触摸该方块时 它会发出警告 但这花了很长
  • Python:计算字典的重复值

    我有一本字典如下 dictA unit1 test1 alpha unit1 test2 beta unit2 test1 alpha unit2 test2 gamma unit3 test1 delta unit3 test2 gamm
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例

随机推荐

  • flutter技术解析与实战!史上最强vue总结来了,威力加强版

    背景 坐标广州 五年iOS开发经验 最近面试了一位工作12年的程序员 这位老哥有3年java开发经验 2年H5 7年iOS开发经验 简历上写着精通Java iOS 熟悉H5开发 没有具体的技术点 说实话我很期待这位老哥的面试 于是让人事邀约
  • 百分比问题,SQL给你答案(百分比计算)

    题目 下面有两张表 交易表 和 产品信息表 假如交易金额大于等于10万 认定为大单 统计产品ID 产品名称 大单数量 大单数量占比 解题思路 思路 先通过分解步骤一步步求出必要字段 再通过分解步骤 最后解决题目要求 即统计产品ID 产品名称
  • 机器学习之线性模型

    定义 线性模型非常常见 但详细了解其中原理是必要的 一般将样本特征进行线性组合达到预测的目标 如表达式 y f X W
  • CLIP论文详解

    CLIP论文详解 潘登同学的深度学习笔记 文章目录 CLIP论文详解 潘登同学的深度学习笔记 前言 整体架构 Pre train Zero shot 实验 大范围数据集结果 few shot与zero shot的对比 Representat
  • 华为手机 图标消失_满满都是回忆!十年前的手机与现在对比,没想到华为手机一点都没变!...

    微创WEC科技 最近流行一个 十年对比挑战 很多网友纷纷拿自己十年前的样子和十年之后的样子来做对比 来看一下十年之间自己有了什么新变化 科技圈也是一样 十年前很多厂商投身到制造手机这个行业中 不过随着优胜劣汰 一些浑水摸鱼的厂商总会被淘汰掉
  • Unix痛恨者手册zz UNIX hater' guide

    转载自 Simson Garfinkel Daniel Weise Steven Strassmann原文由pengchengzou张贴 张贴者 pengchengzou old hand 张贴日期 06 20 02 21 33 一本很有趣
  • MES系统的应用价值

    MES系统是企业智能工厂建设的标志 同时也是企业数字化 智能制造必备的工具之一 MES系统处于计划层和现场自动化系统之间 属于执行层的系统 MES系统的主要功能包括车间生产管理和调度执行 一个设计开发科学完善 贴合企业实际需求的MES系统可
  • thinkpad e480 f1键常亮没有声音

    我这里说的电脑指的是 ThinkPad E480 可能你会发现自己的电脑莫名其妙的没有声音了 此时你的F1键可能亮 也可能不亮 但你如果再关机重启 那么你会发现 你的F1键 极大的可能是不亮的 有很多人说是Fn f1键 但这不是根本 关键在
  • 关于DllRegisterServer的调用失败的问题解决办法

    今天在注册ActiveX控件时出错了 错误提示是XXX ocx已加载 但是DllRegisterServer调用失败 其实在日常的工作中 用regsvr32 命令注册dll ocx等时 这种模块已加载 但DllRegisterServer的
  • matlab 非极大值抑制,Matlab nonmaxsup——非最大值抑制 hysthresh—— 联合开发网 - pudn.com...

    Matlab 所属分类 matlab例程 开发工具 matlab 文件大小 4466KB 下载次数 88 上传日期 2014 05 10 17 18 37 上 传 者 廖志伟 说明 nonmaxsup 非最大值抑制 hysthresh 设定
  • kp = sift.detect(gray,None)cv2.error: Unknown C++ exception from OpenCV code

    在我们学习opencv的时候 会遇到一下算法的专利问题 比如我这次学习中在使用SIFT算法来检测角点时 下面分享一下如何解决SIFT不能只用的问题 原代码 import cv2 import numpy as np img cv2 imre
  • 若依框架图片上传、富文本框编辑器功能

    文章目录 一 前言 二 效果 三 编码过程 1 前端 index vue projectShow js 富文本框 Editor index vue 图片上传 ImgUploadCropper index vue 2 后端 实体Project
  • plc 变量的数据类型

    标准数据类型 布尔型数据类型 布尔型变量可被赋予 TRUE 真或 FALSE 假 这个值为逻辑量 占用1 位存储空间 整型数据类型 整型变量可以是 BYTE WORD DWORD SINT USINT INT UINT DINT 和UDIN
  • Pentaho学习笔记

    一 Pentaho 整体架构 cc 二 Client tools 1 Report Designer 报表创建工具 如果想创建复杂数据驱动的报表 这是合适工具 2 Design Studio 这是基于eclipse的工具 你可以使用它来创建
  • [咕噜Todo]我写了一个简单易用的todo pc工具、希望你也喜欢。

    官网 https anfo fun group 工作台 使用tags灵活分类 还可以设置子任务 视图管理等 日历 直观了解计划完成情况 轻松应对deadline 动态 根据tags连接世界 与朋友一起进步 正在做 客户端的功能 多任务并行也
  • 如何将Hyperledger Fabric PoC应用程序部署到云端

    我假设你已经学习了如何构建Hyperledger Fabric区块链网络 并且你还学习了如何在Node js或Fabric支持的其他语言中创建链代码 并且你已经学会了如何在这样的基础上开发Web应用程序在网络上 否则建议你先看看使用Hype
  • 串口服务器能发ttl信号吗,串口服务器是怎么实现通信的

    串口服务器是怎么实现通信的 复制链接 串口服务器作用通过串口把工业设备通过有线 RJ45 或无线 WIFI 的方式连连接到以太网上 来实现设备的远程传输与管理 那么串口服务器通信是怎么样通信的呢 下面就以众山设备ZSE310为例 介绍串口服
  • Python图片批量自动抠图去背景

    今天发现个好东西啊 叫片刻抠图 是一个在线对图片自动抠图去除背景的网站 只要上传图片 就可以自动把背景去掉把目标对象抠出来 不管是动物 汽车或各种产品 还是人物 都可以全自动做到令人惊艳的抠图效果 而且还说可以做到发丝级 AI 自动抠图 作
  • 牛客编程1-给定区间[-2^31, 2^31]内的3个整数A、B和C,请判断A+B是否大于C。

    给定区间 2 31 2 31 内的3个整数A B和C 请判断A B是否大于C include
  • 09. bs4解析基础与实例

    目录 前言 bs4的安装 bs4使用基础 bs4实例 获取某网站菜价 代码实现 完整代码 重要提醒 总结 前言 我们已经具备了基本的HTML知识 能够简单的识别HTML源代码中的各类元素 这一节我们将正式学习bs4的用法 并用一个实例来展示