首页 > 其他分享 >03-数据提取

03-数据提取

时间:2024-02-11 09:56:02浏览次数:29  
标签:03 提取 name com html BeautifulSoup soup tag 数据

本节概要:如何提取嵌入在HTML格式中的文本信息。

image-20231201175308833

很多网站请求后,返回的数据是嵌套在HTML格式中的。例如:5xclass.cn

对于这种情况想要提取其中的数据,常见有两种方法:

  • 基于bs4模块(本节重点
  • 基于xpath模块

1.HTML格式

<div>
    <h1 class="item">武沛齐</h1>
    <ul class="item">
        <li>篮球</li>
        <li>足球</li>
    </ul>
    <div id='x3'>
        <span>5xclass.cn</span>
        <a>pythonav.com</a>
    </div>
</div>

可以根据 标签名称标签属性 来实现直接或间接寻找标签。

2.bs4

基于bs4可以实现去HTML格式的包裹的数据库中快速提取我们想要的数据。

2.1 安装

pip3 install beautifulsoup4
或
pip3.11 install beautifulsoup4

2.2 使用

  • 根据标签名称,获取标签(只获取找到的第1个)

    from bs4 import BeautifulSoup
    
    html_string = """<div>
        <h1 class="item">武沛齐</h1>
        <ul class="item">
            <li>篮球</li>
            <li>足球</li>
        </ul>
        <div id='x3'>
            <span>5xclass.cn</span>
            <a href="www.xxx.com" class='info'>pythonav.com</a>
        </div>
    </div>"""
    
    soup = BeautifulSoup(html_string, features="html.parser")
    
    tag = soup.find(name='a')
    
    print(tag)       # 标签对象
    print(tag.name)  # 标签名字 a
    print(tag.text)  # 标签文本 pythonav.com
    print(tag.attrs) # 标签属性 {'href': 'www.xxx.com', 'class': ['info']}
    
  • 根据属性获取标签(只获取找到的第1个)

    # @课程   : 爬虫逆向实战课
    # @讲师   : 武沛齐
    # @课件获取: wupeiqi666
    
    from bs4 import BeautifulSoup
    html_string = """<div>
        <h1 class="item">武沛齐</h1>
        <ul class="item">
            <li>篮球</li>
            <li>足球</li>
        </ul>
        <div id='x3'>
            <span>5xclass.cn</span>
            <a href="www.xxx.com" class='info'>pythonav.com</a>
        </div>
    </div>"""
    
    soup = BeautifulSoup(html_string, features="html.parser")
    
    tag = soup.find(name='div', attrs={"id": "x3"})
    
    print(tag)
    
  • 嵌套读取,先找到某个标签,然后再去孩子标签中寻找

    # @课程   : 爬虫逆向实战课
    # @讲师   : 武沛齐
    # @课件获取: wupeiqi666
    
    from bs4 import BeautifulSoup
    
    html_string = """<div>
        <h1 class="item">武沛齐</h1>
        <ul class="item">
            <li>篮球</li>
            <li>足球</li>
        </ul>
        <div id='x3'>
            <span>5xclass.cn</span>
            <a href="www.xxx.com" class='info'>pythonav.com</a>
            <span class='xx1'>武沛齐</span>
        </div>
    </div>"""
    soup = BeautifulSoup(html_string, features="html.parser")
    parent_tag = soup.find(name='div', attrs={"id": "x3"})
    
    child_tag = parent_tag.find(name="span", attrs={"class": "xx1"})
    
    print(child_tag)
    
  • 读取所有标签(多个)

    html_string = """<div>
        <h1 class="item">武沛齐</h1>
        <ul class="item">
            <li>篮球</li>
            <li>足球</li>
        </ul>
        <div id='x3'>
            <span>5xclass.cn</span>
            <a href="www.xxx.com" class='info'>pythonav.com</a>
            <span class='xx1'>武沛齐</span>
        </div>
    </div>"""
    
    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(html_string, features="html.parser")
    tag_list = soup.find_all(name="li")
    print(tag_list)
    
    # 输出
    # [<li>篮球</li>, <li>足球</li>]
    
    html_string = """<div>
        <h1 class="item">武沛齐</h1>
        <ul class="item">
            <li>篮球</li>
            <li>足球</li>
        </ul>
        <div id='x3'>
            <span>5xclass.cn</span>
            <a href="www.xxx.com" class='info'>pythonav.com</a>
            <span class='xx1'>武沛齐</span>
        </div>
    </div>"""
    
    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(html_string, features="html.parser")
    tag_list = soup.find_all(name="li")
    for tag in tag_list:
        print(tag.text)
    
    # 输出
    篮球
    足球
    

3.案例:X车网

获取所有的汽车品牌列表。

https://car.yiche.com/

image-20231201183230411

import requests
from bs4 import BeautifulSoup

res = requests.get(url="https://car.yiche.com/")

soup = BeautifulSoup(res.text, features="html.parser")
tag_list = soup.find_all(name="div", attrs={"class": "item-brand"})
for tag in tag_list:
    print(tag.attrs['data-name'])
import requests
from bs4 import BeautifulSoup

res = requests.get(url="https://car.yiche.com/")

soup = BeautifulSoup(res.text, features="html.parser")
tag_list = soup.find_all(name="div", attrs={"class": "item-brand"})
for tag in tag_list:
    child = tag.find(name='div', attrs={"class": "brand-name"})
    print(child.text)

4.案例:网易云音乐

https://music.163.com/#/discover/playlist/?cat=华语

image-20231201185755569

采集标签+图片下载:

import requests
from bs4 import BeautifulSoup

res = requests.get(
    url="https://music.163.com/discover/playlist/?cat=%E5%8D%8E%E8%AF%AD",
    headers={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
        "Referer": "https://music.163.com/"
    }
)

soup = BeautifulSoup(res.text, features="html.parser")

parent_tag = soup.find(name='ul', attrs={"id": "m-pl-container"})

for child in parent_tag.find_all(recursive=False):
    title = child.find(name="a", attrs={"class": "tit f-thide s-fc0"}).text
    image_url = child.find(name='img').attrs['src']
    print(title, image_url)

    # 每个封面下载下来
    img_res = requests.get(url=image_url)
    file_name = title.split()[0]
    with open(f"{file_name}.jpg", mode='wb') as f:
        f.write(img_res.content)

标签:03,提取,name,com,html,BeautifulSoup,soup,tag,数据
From: https://www.cnblogs.com/fuminer/p/18013180

相关文章

  • 【数据库】对大数据量数据集,PostgreSQL分组统计数量,限定每组最多数量
    一、背景介绍在处理大数据量数据集时,我们经常需要进行分组统计。例如,我们需要统计每个城市的人口数量、每个年龄段的人数等。在PostgreSQL中,我们可以使用row_number()函数结合over(partitionby)子句来实现这个功能。同时,为了限定每组最多数量,我们可以使用row_num<=100......
  • Python--变量和简单数据类型
    Python--变量和简单数据类型变量的命名和使用1.变量名只能包含字母、数字和下划线。变量名可以字母或下划线打头,但不能以数字打头,例如,可将变量命名为message_1,但不能将其命名为1_message。1_message="helloworld"#错误写法message_1="helloworld"#正确写法2.变量名不能......
  • C#使用MiniExcel导入导出数据到Excel/CSV文件
    MiniExcel简介简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel尝试以Stream角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。特点:低内存耗用,避免OOM、频繁......
  • 大厂的供应链域数据中台设计
    关注我,紧跟本系列专栏文章,咱们下篇再续!作者简介:魔都技术专家兼架构,多家大厂后端一线研发经验,各大技术社区头部专家博主,编程严选网创始人。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。负责:中央/分销预订系统性能优化活动&优惠券等营销中台建设交易平台及数据中台......
  • 【Java 并发】【十】【JUC数据结构】【十】PriorityBlockingQueue 原理
    1 前言这节我们继续看看另一个队列 PriorityBlockingQueue,优先级的哈。2 PriorityBlockingQueue介绍PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最高或者最低的元素。其内部是使用平衡二叉树堆实现的,所以直接遍历队列元素不保证有序。默认使......
  • 【Java 并发】【十】【JUC数据结构】【九】ConcurrentLinkedQueue 原理
    1 前言JDK中提供了一系列场景的并发安全队列。总的来说,按照实现方式的不同可分为阻塞队列和非阻塞队列,前者使用锁实现,而后者则使用CAS非阻塞算法实现。这节我们来看看 ConcurrentLinkedQueue。2 ConcurrentLinkedQueue介绍ConcurrentLinkedQueue是线程安全的无界非阻......
  • ()氏提取器
    还愿。远古时期填的一个歌(取badapple曲)去描述更远古的一个广为人知的事。大概的曲谱:写的抽象的词:1七月盛夏中,草木凋零,ix讳会锁伟大之降落,寒光震慑hn中沼泽。撮盐入火般,崭露锋芒,秋来春去鼎盛突逢祸,竟遭贬谪西藏。会锁锁苍穹,东方水神慑众峰,卧水尝雪御西藏,坐断西南塞四方。......
  • dotnet_sqlite_sqlhelper_数据库连接_数据库依赖注入
    DI魅力渐显_依赖注入\Program.csservices.AddScoped<IDbConnection>(sp=>{stringconnStr="DataSource=test.db";varconn=newSqliteConnection(connStr);conn.Open();returnconn;});DI魅力渐显_依赖注入\UserDAO.csprivatereadonly......
  • 数据库工具
    数据库工具5个实用的SQLite数据库可视化工具(GUI)https://zhuanlan.zhihu.com/p/672716531前言SQLite是一个轻量级的嵌入式关系型数据库,目前最新的版本是SQLite3。今天推荐5个实用的SQLite数据库可视化工具(GUI),帮助大家更好的管理SQLite数据库。什么是SQLite?SQLite是一个......
  • 提取数据
    packageorg.pdffolder.pdffolder01;importorg.apache.pdfbox.pdmodel.PDDocument;importorg.apache.pdfbox.text.PDFTextStripper;importorg.apache.tika.utils.StringUtils;importjava.io.File;importjava.util.regex.Matcher;importjava.util.regex.Pattern;......