爬虫工具之Beautiful Soup学习

2023-10-28

参考:【Python技能树共建】Beautiful Soup_梦想橡皮擦的博客-CSDN博客

Beautiful Soup主要用于将 HTML 标签转换为 Python 对象树,然后让我们从对象树中提取数据。

基础用法

import requests
from bs4 import BeautifulSoup


def ret_html():
    """获取HTML元素"""
    res = requests.get('https://www.crummy.com/software/BeautifulSoup/', timeout=3)
    return res.text


if __name__ == '__main__':
    html_str = ret_html()
    soup = BeautifulSoup(html_str, 'lxml')
    print(soup)

上述输出就是普通的html格式文件,我们可以调用 soup 对象的 soup.prettify() 方法,可以将 HTML 标签进行格式化操作

BeautifulSoup 类的构造函数中传递的两个参数,一个是待解析的字符串,另一个是解析器,官方建议的是 lxml,因其解析速度快。

BeautifulSoup 类可以将 HTML 文本解析成 Python 对象树,而这里面又包括最重要的四种对象,分别是 TagNavigableStringBeautifulSoupComment 对象

测试文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试</title>
</head>
<body>
<div class="userful">
    <ul>
        <li class="info">我需要的信息1</li>
           <li class="test">我需要的信息2</li>
           <li class="strange">我需要的信息3</li>
    </ul>
</div>

<div class="useless">
    <ul>
         <li class="info">垃圾1</li>
           <li class="info">垃圾2</li>
    </ul>

</div>

</body>
</html>

BeautifulSoup 对象

该对象本身就代表整个 HTML 页面,而且实例化该对象的时候,还会自动补齐 HTML 代码。

    html_str = ret_html()
    soup = BeautifulSoup(html_str, 'lxml')
    print(type(soup))

Tag 对象

Tag 是标签的意思,Tag 对象就是网页标签,或者叫做网页元素对象,例如获取 bs4 官网的 h1 标签对象,代码如下所示:

 html_str = ret_html()
    soup = BeautifulSoup(html_str, 'lxml')
    # print(soup.prettify())
    print(soup.h1)

 输出soup.h1的type,可以看到,它是一个tag对象

既然是 Tag 对象,那就会具备一些特定的属性值

获取标签名称

    print(soup.h1)
    print(type(soup.h1))
    print(soup.h1.name)  # 获取标签名称

通过 Tag 对象获取标签的属性值

    print(soup.img)  # 获取网页第一个 img 标签
    print(soup.img['src'])  # 获取网页元素DOM的属性值

通过 attrs 属性获取标签的所有属性

    print(soup.img)  # 获取网页第一个 img 标签

    print(soup.img.attrs)  # 获取网页元素的所有属性值,以字典形式返回

 

 

print("soup.link",soup.link)
print("soup.link['href']",soup.link['href'])
print("soup.link.attrs",soup.link.attrs)

 

 

NavigableString 对象

NavigableString 对象获取的是标签内部的文字内容,例如 p 标签,在下述代码中提取的是 我是橡皮擦

<p>我是橡皮擦</p>

获取该对象也非常容易,使用 Tag 对象的 string 属性即可。

    nav_obj = soup.h1.string
    print(type(nav_obj))

输出结果如下所示

<class 'bs4.element.NavigableString'>

如果目标标签是一个单标签,会获取到 None 数据

除了使用对象的 string 方法外,还可以使用 text 属性和 get_text() 方法来获取标签内容

    print(soup.h1.text)
    print(soup.p.get_text())
    print(soup.p.get_text('&'))

其中 text 是获取所有子标签内容的合并字符串,而 get_text() 也是相同的效果,不过使用 get_text() 可以增加一个分隔符,例如上述代码的 & 符号,还可以使用,strip=True 参数去除空格。

 

print("soup.title.string-------",soup.title.string)
print("type(soup.title.string)------",type(soup.title.string))
print("soup.title.text-----",soup.title.text)
print("soup.title.get_text()-----",soup.title.get_text())

 

 

find() 方法和 find_all() 方法

调用 BeautifulSoup 对象和 Tag 对象的 find() 方法,可以在网页中找到指定对象,该方法的语法格式如下:

obj.find(name,attrs,recursive,text,**kws)

方法的返回结果是查找到的第一个元素,如果没查询到,返回 None。
参数说明如下:

  • name:标签名称;
  • attrs:标签属性;
  • recursive:默认搜索所有后代元素;
  • text:标签内容。
soup = BeautifulSoup(open('test.html', encoding='utf-8'), 'lxml')
print(soup.find('title'))#查找title标签

 

也可以使用 attrs 参数进行查找

soup = BeautifulSoup(open('test.html', encoding='utf-8'), 'lxml')
print(soup.find(attrs={'class':'info'}))

 

 

find() 方法还提供了一些特殊的参数,便于直接查找,例如可以使用 id=xxx,查找属性中包含 id 的标签,可以使用 class_=xxx,查找属性中包含 class 的标签。

print(soup.find(class_='cta'))

与 find() 方法成对出现的是 find_all() 方法,看名称就能知道其返回结果收是全部匹配标签,语法格式如下:

obj.find_all(name,attrs,recursive,text,limit)

 limit 参数,它表示最多返回的匹配数量,find() 方法可以看作 limit=1,这样就变得容易理解了。

练习

获取所有p标签文本

获取所有p标签里的文本

# -*- coding: UTF-8 -*-
from bs4 import BeautifulSoup

def fetch_p(html):
    soup=BeautifulSoup(html,'lxml')
    p_list=soup.findall('p')
    results=[p.text for p in p_list]
    return results

if __name__ == '__main__':
    html = '''
        <html>
            <head>
                <title>这是一个简单的测试页面</title>
            </head>
            <body>
                <p class="item-0">body 元素的内容会显示在浏览器中。</p>
                <p class="item-1">title 元素的内容会显示在浏览器的标题栏中。</p>
            </body>
        </html>
        '''
    p_text = fetch_p(html)
    print(p_text)

获取网页的text 

from bs4 import BeautifulSoup

def fetch_text(html):
    soup=BeautifulSoup(html,'lxml')
    result=soup.text
    return result

if __name__ == '__main__':
    html = '''
        <html>
            <head>
                <title>这是一个简单的测试页面</title>
            </head>
            <body>
                <p class="item-0">body 元素的内容会显示在浏览器中。</p>
                <p class="item-1">title 元素的内容会显示在浏览器的标题栏中。</p>
            </body>
        </html>
        '''
    text = fetch_text(html)
    print(text)

 

查找网页里所有图片地址

from bs4 import BeautifulSoup

def fetch_imgs(html):
    soup=BeautifulSoup(html,'html.parser')
    imges=[tag['src'] for tag in soup.find_all('img')]
    return imgs

def test():
    imgs = fetch_imgs(
        '<p><img src="http://example.com"/><img src="http://example.com"/></p>')
    print(imgs)

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

爬虫工具之Beautiful Soup学习 的相关文章

  • 从Python中的对象列表中提取属性列表

    我有一个uniformpython 中的对象列表 class myClass object def init self attr self attr attr self other None objs myClass i for i in
  • Keras 中的 load_model 和 Lambda 层

    如何加载具有 lambda 层的模型 这是重现行为的代码 MEAN LANDMARKS np load data mean shape 68 npy def add mean landmarks x mean landmarks np ar
  • Python XLWT调整列宽

    XLWT 的易用性给我留下了深刻的印象 但有一件事我还没有弄清楚该怎么做 我正在尝试将某些行调整为显示所有字符所需的最小宽度 换句话说 如果双击单元格之间的分隔线 excel 会做什么 我知道如何将列宽调整为预定量 但我不确定如何确定显示所
  • Python2 math.fsum 不准确?

    我正在使用 python2 数学模块来计算 fsum 的总和 据我所知 0 1通常不能存储二进制 据我了解 math fsum 应该以某种方式解决这个问题 import math math fsum 0 0 0 1 0 1 math fsu
  • 将鼠标悬停在 Folium 的弹出窗口中

    用这样一个简单的例子 import folium map 1 folium Map location 45 372 121 6972 zoom start 12 tiles Stamen Terrain folium Marker 45 3
  • 尝试将行附加到按对象分组中的每个组时出现奇怪的行为

    这个问题是关于一个函数在应用于两个不同的数据帧时以意想不到的方式表现的 更准确地说 是 groupby 对象 要么是我遗漏了一些明显错误的东西 要么是 pandas 中存在错误 我编写了以下函数 将一行附加到 groupby 对象中的每个组
  • 如何针对 Heroku 路由器的代理/缓冲情况优化 uWSGI?

    我在 Heroku 的生产中使用 uWSGI 已有一年多了 它似乎比 Gunicorn 处理所有事情都要好得多 随着我们的流量扩大 我试图更好地理解heroku的路由器和uWSGI之间的接口 以优化和防止问题 但它对我来说仍然相当不透明 我
  • ibapi nextValidId 并不总是被调用

    我构建了一个小型 ibapi python 应用程序来运行一些策略 同时注意保持与 tws 的连接 如果 tws 处于非活动状态 python 应用程序将启动并等待 并在 tws 启动时连接到 tws 但这是我的问题 nextValidId
  • AMLS 实验运行停留在“正在运行”状态

    我运行了 Azure 机器学习服务实验 并使用 Jupyter Notebook 记录了神经网络损失 日志记录工作正常 神经网络训练也按预期完成 但实验一直停留在运行状态 关闭计算资源不会关闭实验运行 我无法从实验面板取消它 此外 运行没有
  • 如何从数据存储区刷新 NDB 实体?

    我希望能够在我的代码调用的测试中断言Model put 对于已修改的实体 不幸的是 似乎正在进行一些缓存 例如以下代码 from google appengine ext import ndb class MyModel ndb Model
  • 在Python中绘制像素的最佳方法[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我想知道 用 x 和 y 值在 python 中绘制像素的最简单方法是什么 可能最简单的方法是使用PIL http effbot org i
  • 视频的 EXIF 之类的东西

    有没有从视频文件中获取信息的标准方法 对于图像 我们有 EXIF 数据 可用于获取有关图像文件的日期 时间 大小等信息 我想知道视频是否也有这样的东西 用例是 我有很多用数码相机拍摄的视频 我想将它们重命名为更有意义的名称 例如 YYYY
  • OSMNX - 边缘的哪个“部分”被认为是最近的

    我正在使用 OSMNX 中的 returned edges 函数 我不清楚在进行此计算时使用边缘的哪个 部分 它是边缘的任何部分吗 是中间点吗 对于网络中的长边来说 这会产生很大的差异 这取决于您如何参数化该函数 来自nearest edg
  • tkinter - 在askopenfile期间检索文件名

    我有一个用 Python 和 tkinter 制作的文本编辑器 这是我的 打开文件 方法 def onOpen self file askopenfile filetypes Text files txt txt file read sel
  • Python条件运算符“if else”不等于“and or”[重复]

    这个问题在这里已经有答案了 我认为下面两个函数的结果会相同 但事实并非如此 def fib2 n return n and n lt 2 or fib2 n 1 fib2 n 2 def fib3 m return m if m lt 2
  • 如何使用 Python 从 URL 中删除查询字符串

    Example http example com a text q2 text2 q3 text3 q2 text4 删除后 q2 它将返回 http example com q text q3 text3 在这种情况下 出现了多个 q2
  • 如何在Python中生成0-1矩阵的所有可能组合?

    如何生成大小为 K N 的 0 1 矩阵的所有可能组合 例如 如果我取 K 2 和 N 2 我会得到以下组合 combination 1 0 0 0 0 combination 2 1 0 0 0 combination 3 0 1 0 0
  • 如何向 Iron Python 添加模块?

    我一直在尝试使用 C Visual Studio 执行以下 Python 代码 graphcreater py 我通过 NuGet 包管理器添加了 IronPyton 2 7 7 和 IronPython StdLib 2 7 7 一旦我运
  • 从 NumPy、matplotlib 包导入 python 子模块有什么区别[重复]

    这个问题在这里已经有答案了 当我尝试使用时pyplot from matplotlib import matplotlib print matplotlib pyplot just checking 它给了我AttributeError m
  • 如何在 python setup.py 中 chmod 文件?

    我使用 setup py 创建了一个 python 包安装 我希望它复制文件夹 为临时创建的 did 中的数据文件 问题是我必须使用 sudo 权限调用 setup py 因为它写入 usr local 因此 当我的数据文件复制到 did

随机推荐

  • IEEE二进制浮点数算术标准(IEEE 754)

    IEEE二进制浮点数算术标准 IEEE 754 是20世纪80年代以来最广泛使用的浮点数运算标准 为许多CPU与浮点运算器所采用 这个标准定义了表示浮点数的格式 包括负零 0 与反常值 denormal number 一些特殊数值 无穷 I
  • C++设计模式篇卷首语

    2023年8月23日 周三上午 我为什么要学习设计模式 今天早上本来想开始写控制台云盘项目的 但是没有设计模式的思想 就算我能写出来 项目代码的质量一定不是很好的 还有一个原因 那就是我昨天晚上看到有人强烈推荐学习设计模式 所以我决定开始学
  • linux原始套接字-发送ARP报文

    linux原始套接字 可以直接发送和接收链路层和网络层的报文 对我们理解TCP IP协议栈有很多帮助 也可写出很多有趣的程序 下面的例子是向192 168 1 60的电脑 发送伪造的ARP报文 使其更新ARP表 导致无法PING通192 1
  • 装饰器原理及应用场景

    原理 1 装饰器的实现是由闭包支撑的 2 装饰器本质上是 个python函数 它可以在让其他函数在不需 要做任何代码的变动的前提下增加额外的功能 3 装饰器的返回值也是 个函数的对象 应用场景 1 可以在外层函数加上时间计算函数 计算函数运
  • Ubuntu常用服务器环境搭建——MySQL篇

    MySQL 1 安装MySQL apt get update apt get install mysql server 2 配置MySQL vi etc mysql my cnf 也可能是 etc mysql mysql conf d my
  • IPsec中IKE与ISAKMP过程分析(主模式-消息5和消息6)

    IPsec中IKE与ISAKMP过程分析 主模式 消息1 搞搞搞高傲的博客 CSDN博客 IPsec中IKE与ISAKMP过程分析 主模式 消息2 搞搞搞高傲的博客 CSDN博客 IPsec中IKE与ISAKMP过程分析 主模式 消息3 搞
  • 与自定义词典 分词_文本挖掘

    基于文本分析的场景有词云图 基于距离的文本聚类 基于监督的文本分类 情感分析等等 不管是文档库 文章 段落或句子 针对文本挖掘的基础都集中于词的分析 即针对文档库 段落 句子等的分词 切词 词是很多中文自然语言处理的基础 分词有助于提取文档
  • SpringCloud OpenFeign模块报错问题

    SpringCloud OpenFeign模块报错问题 问题 问题原因 使用Spring Initializr初始化项目引入了openfeign 没有在意版本 直到运行项目进行远程调用时报错 由于Spring Cloud Feign在Hox
  • JDBC URL

    1 JDBC URL的概念 JDBC URL提供了一种标识数据库的方法 可以使相应的驱动程序能识别该数据库并与之建立连接 实际上 驱动程序编程员将决定用什么JDBC URL来标识特定的驱动程序 用户不必关心如何来形成JDBC URL 它们只
  • 常见的响应式布局解决方法

    由于设备的分辨率不同 我们就用响应式布局来解决设备分辨率不同的问题 常见的解决方法有px视口 媒体查询 百分比 rem 和vw vh等方法来实现响应式布局 接下来介绍下个种方法 一 px和视口 在静态网页中 我们经常用像素 px 作为单位
  • YOLOv7环境搭建、训练流程以及转TensorRT部署问题

    一 背景 github官网yolov7 代码什么的从这个网站下 还有一个 但是这是官网 二 环境搭建 有两种环境搭建方式 一是用conda搭个虚拟环境 然后安装所有需要的库跟依赖等 二是用docker容器 下载英伟达的pytorch ima
  • Flume基础知识(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 概述 Flume用于离线日志的 采集与传输 Agent 单台机器a1
  • 分析jdk 1.8 ConcurrentHashMap 的put 方法

    如有转载请注明出处https blog csdn net weixin 41955327 article details 90228701 public V put K key V value 点击进入putVal return putVa
  • Nacos 2.0.3 源码启动

    下载源码 git clone https github com alibaba nacos git 然后切换分支 到 2 0 3 git checkout 2 0 3 nacos 工程目录 INFO Alibaba NACOS 2 0 3
  • vue项目点击侧边栏刷新页面

    在很多vue后台demo中都会有点击侧边栏刷新页面的需求 在很多演示中对这部分并没有太多的考虑 今天作者就对该部分的代码设计做一个介绍 首先直接上代码 修改路由分发的部分 在app vue或者具体项目中路由分发的地方引入v if isRou
  • python读取csv文件_python配置文件的读取

    本文主要分享下python中如何读取配置文件 1 首先我们要了解什么是配置文件 2 配置文件就是项目使用的常量 我们把它们放在一个文件里面 一般以 ini conf xml yaml等结尾 比如 test conf product yaml
  • Mol Cell Proteomics.

    期刊 Mol Cell Proteomics 题目 Celastrol protects from cholestatic liver injury though modulation of SIRT1 FXR signaling 通讯作者
  • 解决wso2 axis2server 跑不起

    wso2ei 6 1 0 运行axis2server报下面找个错误 Server could not start due to class loading issue java lang NoSuchMethodException samp
  • Anaconda安装过程

    Anaconda的安装与配置 1 1 下载Anaconda 网址 https www anaconda com download 1 2 安装教程 网址 https blog csdn net ITLearnHall article det
  • 爬虫工具之Beautiful Soup学习

    参考 Python技能树共建 Beautiful Soup 梦想橡皮擦的博客 CSDN博客 Beautiful Soup主要用于将 HTML 标签转换为 Python 对象树 然后让我们从对象树中提取数据 基础用法 import reque