爬虫工具-BeautifulSoup

news2024/9/22 23:21:54
 

BeautifulSoup:

        1. 是一个高效的网页解析库,可以从HTML或者XML文件中提取数据

        2. 支持不同的解析器,可以对HTML、XML等进行解析

        3. 是一个敏感又方便的网页解析库,处理高效,支持多种解析器

        4. 利用它在不编写正则表达式的情况下也能方便的实现网页信息的抓取

一、标签选择器:

   假设网页返回的HTML文件如下:

h = """
<html>
    <head>
        <title>The Dormouse's story</title>
    </head>
    <body>
    <p class="title asdas" name="abc" id = "qwe"><b>The Dormouse's story</b></p>
    <p class="story">Once upon a time there were three little sisters; and their names were
    <a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>,
    <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
    <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
    and they lived at the bottom of a well.</p>
    <p class="story">...</p>
"""

1  .string  --获取文本内容

# 1.导包
from bs4 import BeautifulSoup
# 2.实例化对象
soup = BeautifulSoup(h, 'lxml')     # 参数1:要解析的内容    参数2:解析器

# 通过标签选取,会返回包含标签本身及其里面的所有内容
print(soup.head)      # 包含head标签在内的所有内容
print(soup.p)         # 返回匹配的第一个结果

# .string是属性,作用是获取字符串文本
print(soup.title.string)

运行结果:

2  .name --获取标签本身名称

from bs4 import BeautifulSoup

soup = BeautifulSoup(h, 'lxml')

print(soup.title.name)    # 返回标签自身的名称
print(soup.p.name)        # 获取标签名

运行结果:

 3   .attrs[] --通过属性拿属性的值

from bs4 import BeautifulSoup

soup = BeautifulSoup(h, 'lxml')

# 写法1
print(soup.p.attrs['name'])   # 获取p标签name属性的属性值
print(soup.a.attrs['href'])   # 获取p标签id属性的属性值

# 写法2
print(soup.p['id'])
print(soup.p['class'])   # 以列表式保存
print(soup.a['href'])    # 也是返回第一个值

运行结果:

 二、标准选择器

   假设网页返回的HTML文件如下:

html='''
<div class="panel">
    <div class="panel-heading">
        <h4>Hello</h4>
    </div>
    <div class="panel-body">
        <ul class="list" id="list-1">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
            <li class="element">Jay</li>
        </ul>
        <ul class="list list-small" id="list-2">
            <li class="element">Foo-2</li>
            <li class="element">Bar-2</li>
        </ul>
    </div>
</div>
'''

1. 使用find_all()根据标签名查找

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')

print(soup.find_all('ul'))  # 拿到所有ul标签及其内容

print(soup.find_all('ul')[0])   # 返回的是列表,可以通过下标获取目标数据

print(soup.find_all('div'))

2.  get_text() 获取内容

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')

for ul in soup.find_all('ul'):
    print(ul)         # 返回的是标签+内容
    print(ul.get_text())     # 只返回内容

运行结果:

3.  使用find_all()根据属性查找

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')

# 特殊属性查找
print(soup.find_all(class_='element'))     # class属于Python关键字,做特殊处理 _
print('---------------------------------')

# 推荐的查找方法!    ---指定标签和属性
print(soup.find_all('li', {'class':'element'}))
print('---------------------------------')
print(soup.find_all('ul', {'id':'list-1'}))

运行结果:

4. text=() 根据文本值选择

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')

# 语法格式:text='要查找的文本内容'
print(soup.find_all(text='Foo'))    # 可以做内容统计用
print(len(soup.find_all(text='Foo')))    # 统计数量

运行结果:

5. find( name , attrs , recursive , text , **kwargs ) 

# find返回单个元素,find_all返回所有元素
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')

print(soup.find('ul'))      # 只返回匹配到的第一个
print(soup.find('page'))    # 如果标签不存在返回None

 运行结果:

三、CSS选择器

        通过select()直接传入CSS选择器即可完成选择

        如果对HTML里的CSS选择器很熟悉可以考虑用此方法

 假设网页返回的HTML文件如下:

html='''
<div class="pan">q321312321</div>
<div class="panel">
    <div class="panel-heading">
        <h4>Hello</h4>
    </div>
    <div class="panel-body">
        <ul class="list" id="list-1">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
            <li class="element">Jay</li>
        </ul>
        <ul class="list list-small" id="list-2">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
        </ul>
    </div>
</div>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')

# 根据标签去找,标签不加任何修饰,多个条件用空格隔开
print(soup.select('ul li'))
print("---------------------------------------")

# class类名前加'.'
print(soup.select('.panel-body'))
print("---------------------------------------")

# 多个条件用空格隔开
print(soup.select('ul.list'))
print(soup.select('ul .element'))
print("---------------------------------------")

# 注意:可以混合使用
# 例如:根据id和class去找
a = soup.select('#list-1 .element')    # .select方法会获取满足条件的所有内容
print(a)
for i in a:
    print(i.string)

获取属性的值:

    两种写法:

        1,ul['id'] 、

        2,ul.attrs['id']

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')

s = soup.select('#list-2')
for ul in s:

    print(ul)

    # 写法1:
    print("-------------------------------------------------")
    print(ul['id'])
    print("-------------------------------------------------")
    print(ul['class'])
    print("-------------------------------------------------")

    # 写法2:
    print(ul.attrs['id'])
    print(ul.attrs['class'])

运行结果:

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

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

相关文章

Unreal 和 Unity 3D 各有什么特点?如何选择?

一、两个引擎简述 Unreal Engine VS Unity Unity是实时3D互动内容创作和运营平台。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助Unity将创意变成现实。Unity平台提供一整套完善的软件解决方案&#xff0c;可用于创作、运营和变现任何实时互动的…

【设计模式】软件设计原则

1. 软件设计原则&#xff1a; 为了提高系统软件的可维护性、可复用性、可扩展性和灵活性 1.1 开闭原则&#xff1a; 对扩展开放&#xff0c;对修改关闭 &#xff08;热插拔&#xff09; 实现方式&#xff1a; 通过定义接口和实现类的方式实现开闭原则&#xff0c;我们再进行…

ASEMI代理艾赛斯IXTY02N50D-TRL车规级MOSFET

编辑-Z 艾赛斯车规级MOS管IXTY02N50D-TRL参数&#xff1a; 型号&#xff1a;IXTY02N50D-TRL 漏极-源极电压&#xff08;VDS&#xff09;&#xff1a;500V 连续漏电流&#xff08;ID&#xff09;&#xff1a;200mA 功耗&#xff08;PD&#xff09;&#xff1a;25W 工作结温…

如何运营推特营销主账号

在推特上做产品推广&#xff0c;Twitter群&#xff08;发&#xff09;推王建议&#xff1a;一般需要两类账号。 主账号&#xff1a;也就是官方号&#xff0c;用来聚集粉丝&#xff0c;日常产品信息、新闻资讯发布的&#xff1b; 批量推广号&#xff1a;也叫小号或者广告号&am…

oracle数据库定义语言—DDL

文章目录1、数据定义语言2 创建表2.2 oracle 数据库中的表2.2.1 常见的数据字典表2.3 用查询创建表2.3.1 示例3 ALTER TABLE 语句3.1 添加一个新的列3.2 修改数据类型3.3 修改默认值3.4 修改列名3.5 删除一个列4、修改名称5、截断表6 、删除表&#xff08;删除表以及表结构&…

《垃圾回收算法手册 自动内存管理的艺术》——引用计数与垃圾回收器的比较(笔记)

文章目录五、引用计数5.1 引用计数算法的优缺点5.2 提升效率5.3 延迟引用计数5.4 合并引用计数5.5 环状引用计数**步骤**5.6受限域引用计数六、垃圾回收器的比较6.1 吞吐量6.2 停顿时间6.3 内存空间6.4 回收器的实现6.5 自适应系统6.6 统一垃圾回收理论6.6.1 垃圾回收的抽象6.6…

神经网络在故障诊断中的应用

人工神经网络是近年来发展迅速&#xff0c;广泛地应用于各个领域&#xff0c;包括航天&#xff0c;自动控制&#xff0c;金融&#xff0c;电子&#xff0c;制造&#xff0c;医药等多个行业&#xff0c;已经有许多成功的先例&#xff0c;并展示了更为广阔的应用前景。基于神经网…

【区块链 | 智能合约】Ethereum源代码(8)- Ethereum服务和以太坊P2P协议发送广播源码分析

在“【区块链 | 智能合约】Ethereum源代码(2)- go-ethereum 客户端入口代码和Node分析”一文中,我们提到Ethereum作为一个service,被Node 注册进去。Node start的时候会启动其注册的所有服务,Ethereum service也是一样。 一、ethereum service的初始化和启动 func geth(c…

【MySQL数据库笔记 - 进阶篇】(二)索引

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;暂定 &#x1f4dd;视频地址&#xff1a;黑马程序员 MySQL数据库入门到精通 &#x1f4e3;专栏定位&#xff1a;这个专栏我将会整理 B 站黑马程序员的 MySQL…

day064:File类与I/O流、绝对路径与相对路径、File类的成员方法

目录 一、什么是File类、IO流 1.File类 2.I/O流 3.File类的构造方法 二、绝对路径与相对路径 三、File类的成员方法 1.File类的创建功能 &#xff08;1&#xff09;createNewFile() 创建空的文件 &#xff08;2&#xff09;mkdir() 创建单级文…

CY5.5(Cyanine5.5) azide, 10 mM/DMSO,花菁染料Cy5.5标记叠氮

产品名称&#xff1a;花菁染料Cy5.5标记叠氮 英文名称&#xff1a;CY5.5(Cyanine5.5) azide 该染料具有远红外/近红外发射&#xff0c;可用于NIR活体成像。Cyanine5.5可以取代Cy5.5、Alexa Fluor 680和DyLight 680。 CAS:2183440-52-8 分子式:C43H49ClN6O 分子量:701.36 …

简单工厂、工厂方法、抽象工厂、抽象工厂加简单工厂

简单工厂模式&#xff1a;简单工模式时类的创建模式&#xff0c;又叫做静态工厂方法&#xff08;static Factory Method&#xff09;。简单工厂模式是一个工厂对象决定创建出哪一种产品类的实例。它存在的目的很简单&#xff1a;定义一个创建对象的接口。简单工厂模式的最大优点…

Spring Boot之容器功能

目录 一.Spring 注入组件的注解 二.Configuration 1.代码演示 1.1JavaBean--》Monster.java 1.2配置类 1.3执行代码 2.Configuration 注意事项和细节 三.Import 1.创建两个JavaBean类 2.注入类 3.测试注解的使用 四.Conditional 1.Conditional 介绍 2.应用实例 …

攻防世界 看雪看雪看雪

看雪看雪看雪 题目附件里面给了张图 尝试文件拆解 无果 尝试放入winhex查找信息 无果 尝试放入stegsolve查找信息 无果 题目说雪 刚好有一种snow隐写的方法 但好像跟图片没有什么关系 后来发现存在ntfs流隐写 你解压之后也可以看到 这里我们使用7zip打开附件的压缩包…

【长难句分析精讲】同位语从句

分析技巧 形式&#xff1a; 抽象名词 that / whether形式&#xff1a; 具体名词 同位语&#xff08;名词短语&#xff09;如&#xff1a;成都&#xff0c;四川省会 练习一 一划二从三主 这里 and 不是关键词 苹果掉到地上而不是掉到树上这个事实&#xff0c;回答了他一直都…

【Jmeter基础篇】05:Linux服务器上部署并运行Jmeter脚本

配置之前请务必已安装JDK并配置好JDK的环境变量。 1. 上传压缩包到Linux服务器 使用FTP即可&#xff08;最好是新建一个/usr/Application/Jmeter的文件夹&#xff0c;放进去。也可以使用自己喜欢的路径&#xff09; # -p的作用是防止当上层文件夹不存在时报错。想体验的话可以…

Flink的六种物理分区策略

文章目录物理分区&#xff08;Physical Partitioning&#xff09;&#x1f355;1.随机分区&#xff08;shuffle&#xff09;&#x1f354;2.轮询分区&#xff08;Round-Robin&#xff09;&#x1f35f;3. 重缩放分区&#xff08;rescale&#xff09;&#x1f32d;4.广播&#x…

深度学习入门(三十八)计算性能——多GPU训练

深度学习入门&#xff08;三十八&#xff09;计算性能——多GPU训练前言计算性能——多GPU训练课件多GPU并行数据并行VS模型并行数据并行总结教材1 问题拆分2 数据并行性3 简单网络4 数据同步5 数据分发6 训练7 小结多GPU的简洁实现1简单网络2 网络初始化3 训练4 小结前言 核心…

因子特征工程:alphalens库深度解析

原创文章第107篇&#xff0c;专注“个人成长与财富自由、世界运作的逻辑&#xff0c; AI量化投资”。 前面的文章我们把数据&#xff0c;因子定制&#xff0c;自动标注的功能都准备好了&#xff0c;今天继续因子分析&#xff0c;分析的框架当然还是alphalens。 星球有一期研报…

Babel插件指南

Babel插件指南 文章目录Babel插件指南Babel简介AST(Abstract syntax tree)简介ESTree AST NodeVisitors&#xff08;访问者&#xff09;Babel APIbabylonbabel-traversebabel generator项目中实践引用自定义的babel插件新增插件js文件确定要实现的功能&#xff0c;编译成AST进行…