首页 > 其他分享 >解析: BeautifulSoup (bs4)

解析: BeautifulSoup (bs4)

时间:2023-04-12 21:47:04浏览次数:33  
标签:__ bs4 标签 BeautifulSoup li soup print 解析 select




    
    <title>Title</title>


    <div>
        <ul>
            <li id="l1">张三</li>
            <li id="l2">李四</li>
            <li>王五</li>
            <a href="" id="" class="a1" rel="noopener">尚硅谷</a>
            <span>嘿嘿嘿</span>
        </ul>
    </div>
    <a href="" title="a2" rel="noopener">百度</a>
    <div id="d1">
        <span>哈哈哈</span>
    </div>
    <p id="p1" class="p1">呵呵呵</p>


"""                                                           
                                       .-''-.               
.--.                    _..._        .' .-.  )              
|__|                  .'     '.     / .'  / /               
.--..-,.--.          .   .-.   .   (_/   / /                
|  ||  .-. |         |  '   '  |        / /                 
|  || |  | | _    _  |  |   |  |       / /         _    _   
|  || |  | || '  / | |  |   |  |      . '         | '  / |  
|  || |  '-.' | .' | |  |   |  |     / /    _.-').' | .' |  
|__|| |    /  | /  | |  |   |  |   .' '  _.'.-'' /  | /  |  
    | |   |   `'.  | |  |   |  |  /  /.-'_.'    |   `'.  |  
    |_|   '   .'|  '/|  |   |  | /    _.'       '   .'|  '/ 
           `-'  `--' '--'   '--'( _.-'           `-'  `--'  
Created on 2023/4/12 20:43.
@Author: haifei
"""
import time
from bs4 import BeautifulSoup as bs


'''
BeautifulSoup,和lxml一样,是一个html的解析器,主要功能也是解析和提取数据

缺点:效率没有lxml的效率高
优点:接口设计人性化,使用方便

创建对象的两种方式:
    1、服务器响应的文件生成对象
        soup = BeautifulSoup(response.read().decode(), 'lxml')
    2、本地文件生成对象
        soup = BeautifulSoup(open('1.html'), 'lxml')

通过解析本地文件 学习bs4的基础语法
'''


# 默认打开的文件的编码格式是gbk 所以在打开文件的时候需要指定编码
soup = bs(open('解析_5_bs4的基本使用.html', encoding='utf-8'), 'lxml')
# print(soup)


# 根据标签名查找节点(找到的是第一个符合条件的数据)
print(soup.a)  # <a class="a1" href="" id="" rel="noopener">尚硅谷</a>
# 获取标签的属性和属性值
print(soup.a.attrs)  # {'href': '', 'id': '', 'class': ['a1']}


# bs4的一些函数
# (1)find  返回的是第一个符合条件的数据
print(soup.find('a'))  # <a class="a1" href="" id="" rel="noopener">尚硅谷</a>
# 根据title的值来找到对应的标签对象
print(soup.find('a', title="a2"))  # <a href="" title="a2" rel="noopener">百度</a>
# 根据class的值来找到对应的标签对象  注意class后天需要+下划线
print(soup.find('a', class_="a1"))  # <a class="a1" href="" id="" rel="noopener">尚硅谷</a>


# (2)find_all  返回一个包含所有的a标签的列表
print(soup.find_all('a'))  # [<a class="a1" href="" id="" rel="noopener">尚硅谷</a>, <a href="" title="a2" rel="noopener">百度</a>]
# 如果想获取多个标签的数据,需要用一个列表将这些标签包裹起来作为find_all的参数
print(soup.find_all(['a', 'span']))  # [<a class="a1" href="" id="" rel="noopener">尚硅谷</a>, <span>嘿嘿嘿</span>, <a href="" title="a2" rel="noopener">百度</a>, <span>哈哈哈</span>]
# limit的作用是查找前几个数据
print(soup.find_all('li', limit=2))  # [<li id="l1">张三</li>, <li id="l2">李四</li>]


# (3)select(推荐)
# select  返回一个包含多个数据的列表
print(soup.select('a'))  # [<a class="a1" href="" id="" rel="noopener">尚硅谷</a>, <a href="" title="a2" rel="noopener">百度</a>]
# 可以通过.代表class(类似前端的类选择器)
print(soup.select('.a1'))  # [<a class="a1" href="" id="" rel="noopener">尚硅谷</a>]
# 可以通过#代表id
print(soup.select('#l1'))  # [<li id="l1">张三</li>]


# 属性选择器(通过属性来寻找对应的标签)
# 查找到li标签中有id的标签
print(soup.select('li[id]'))  # [<li id="l1">张三</li>, <li id="l2">李四</li>]
# 查找到li标签中id为l2的标签
print(soup.select('li[id="l2"]'))  # [<li id="l2">李四</li>]
# 找到a标签和li标签的所有的对象
print(soup.select('a,li'))  # [<li id="l1">张三</li>, <li id="l2">李四</li>, <li>王五</li>, <a class="a1" href="" id="" rel="noopener">尚硅谷</a>, <a href="" title="a2" rel="noopener">百度</a>]


# 层级选择器
# 1、后代选择器
# 找到的是div下面的li,通过空格,可以跨层级
print(soup.select('div li'))  # [<li id="l1">张三</li>, <li id="l2">李四</li>, <li>王五</li>]
print(soup.select('div ul li'))  # [<li id="l1">张三</li>, <li id="l2">李四</li>, <li>王五</li>]
# 2、子代选择器
# 某标签的第一级子标签,通过'&gt;',逐级
print(soup.select('div&gt;li'))  # []
print(soup.select('div&gt;ul&gt;li'))  # [<li id="l1">张三</li>, <li id="l2">李四</li>, <li>王五</li>]


# 节点信息
# 1、获取节点内容
obj = soup.select('#d1')[0]
print(obj.string)  # None
print(obj.get_text())  # 哈哈哈
'''
如果标签对象中 只有内容 那么string和get_text()都可以使用
如果标签对象中 除了内容还有标签 那么string就获取不到数据 而get_text()可以获取数据
我们一般情况下 推荐使用get_text()
'''


# 2、节点的属性
obj = soup.select('#p1')[0]
# name是标签的名字
print(obj.name)  # p
# attrs将属性值作为一个字典返回
print(obj.attrs)  # {'id': 'p1', 'class': ['p1']}

print(obj.attrs.get('class'))  # ['p1']
print(obj.get('class'))  # ['p1']
print(obj['class'])  # ['p1']


if __name__ == '__main__':
    start = time.time()
    print('It takes', time.time() - start, "seconds.")

"""                                                           
                                       .-''-.               
.--.                    _..._        .' .-.  )              
|__|                  .'     '.     / .'  / /               
.--..-,.--.          .   .-.   .   (_/   / /                
|  ||  .-. |         |  '   '  |        / /                 
|  || |  | | _    _  |  |   |  |       / /         _    _   
|  || |  | || '  / | |  |   |  |      . '         | '  / |  
|  || |  '-.' | .' | |  |   |  |     / /    _.-').' | .' |  
|__|| |    /  | /  | |  |   |  |   .' '  _.'.-'' /  | /  |  
    | |   |   `'.  | |  |   |  |  /  /.-'_.'    |   `'.  |  
    |_|   '   .'|  '/|  |   |  | /    _.'       '   .'|  '/ 
           `-'  `--' '--'   '--'( _.-'           `-'  `--'  
Created on 2023/4/12 21:22.
@Author: haifei
"""
import time
from urllib import request
from bs4 import BeautifulSoup


url = 'https://www.starbucks.com.cn/menu/beverages/'
response = request.urlopen(url)
content = response.read().decode('utf-8')
# print(content)

soup = BeautifulSoup(content, 'lxml')
# xpath: //ul[@class="grid padded-3 product"]//strong/text()
name_list = soup.select('ul[class="grid padded-3 product"] strong')
for name in name_list:
    print(name.get_text())

'''
阿馥奇朵™
麦芽雪冷萃™
冷萃浮乐朵™
气致™冷萃浮乐朵™
冷萃冰咖啡
轻甜奶油冷萃
绵云冷萃
美式咖啡(热/冷)
拿铁(热/冷)
摩卡(热/冷)
卡布奇诺(热/冷)
焦糖玛奇朵(热/冷)
浓缩咖啡
馥芮白™
榛果风味拿铁(热/冷)
香草风味拿铁(热/冷)
焦糖浓缩咖啡星冰乐
抹茶星冰乐
芒果西番莲果茶星冰乐
摩卡星冰乐
摩卡可可碎片星冰乐
香草风味星冰乐
气炫冰山美式
橙柚派对
醋意桃桃
酸柠浮冷萃
气致™冷萃咖啡
经典巧克力饮品(热/冷)
红茶拿铁(热/冷)
抹茶拿铁(热/冷)
茶瓦纳™ 冰摇柚柚蜂蜜红茶
冰摇红莓黑加仑茶
冰摇芒果花草茶
茶瓦纳™冰摇桃桃乌龙茶
梨光清润路芭茶
橘香柚柚花草茶
'''


if __name__ == '__main__':
    start = time.time()
    print('It takes', time.time() - start, "seconds.")

标签:__,bs4,标签,BeautifulSoup,li,soup,print,解析,select
From: https://www.cnblogs.com/yppah/p/17311378.html

相关文章

  • CS231N assignment 2 _ 全连接神经网络 学习笔记 & 解析
    本章内容较多预警Intro我们写过一个两层的神经网络,但是梯度是在loss内计算的,因此对网络的架构相关的修改难免比较困难.为此,我们需要规范化网络设计,设计一系列函数.,后面我们还会封装一个类,这也是最希望的方式了.环境搭建又到了工科生最上头(bushi的搭环境环节.......
  • PyQuery数据解析
    PyQuery数据解析1、导入frompyqueryimportPyQuery2、创建PyQuery对象p=PyQuery("页面源代码")3、定位#用法a=p("css选择器")a=p("a")#选择a标签a=p("li")("a")#选择li下的a标签a=p(".aaaa")#选择class="......
  • 论文解析 -- AIOps- A Multivocal Literature Review
    这篇综述是基于ASystematicMappingStudyinAIOps的基础上的补充和更新。除了论文,还涵盖greyliterature(e.g.,blogposts,videos,andwhitepapers) ,所以称MultivocalOurworkwillcomplementtheworkperformedbytheseauthorsaddingalsoinsightsfromgre......
  • 解析566回调函数
    1.这是一个结构体,ConfigCallBack,是结构体别名,*pConfigCallBack是结构体指针  里面是两个函数指针,一个是GetConfigCB,一个是SetConfigCB.很明显是获取和设置配置的函数指针。2.实现    3.定义在类里面,然后类成员函数调用即可,用结构体别名定义 ......
  • C#请求访问HTTP+JSON数据的解析
    一、前言最近工作客户需要一个HTTP的Mes需求,所以自己去学习了C#请求HTTP的方法以及JSON数据的解析方法,总结出了点经验,以便后续自己找起来方便一点,故在此写一篇文章。二、准备工作下面我用一个聚合数据提供的天气预报API接口来阐述请求HTTP和JSON数据解析的功能;先看API文档这么访......
  • 域名DNS解析不及时变更?网安大队请你去喝茶
    今天早上的时候被一个电话打醒,是当地网安大队找我,顿时心里一惊,说我网站访问有一个叫什么的教育培训网站,问这个网站和我什么关系,我一脸懵,后面让我去一下网安大队。事情是这样的,之前在阿里云租了几年的服务器,起初是打算上线自己项目,但种种事情耽误了进度,服务器闲置一段时间后于今年......
  • 论文解析 -- A Systematic Mapping Study in AIOps
    AIOPS论文的综述如何挑选论文,如何选取keywords 搜索的3个论文库, Weselectthreeonlinesearchdatabasesthatareappropriateforthescopeofinvestigation:IEEEXplore,ACMDigitalLibraryandarXiv. 对于挑选出的论文进行分类,分类标准是,targetcomponents......
  • C#属性(Attribute)用法实例解析
    属性(Attribute)是C#程序设计中非常重要的一个技术,应用范围广泛,用法灵活多变。本文就以实例形式分析了C#中属性的应用。具体如下:一、运用范围程序集,模块,类型(类,结构,枚举,接口,委托),字段,方法(含构造),方法,参数,方法返回值,属性(property),Attribute[AttributeUsage(AttributeTargets.All)]......
  • memset初始化类对象出错解析
    void*memset(void*s,intv,size_tn); 英文释义如下:Copiesthevaluev(convertedtotypeunsignedchar)tothefirstnbytespointedtobys;returnss. 这里s可以是数组名,也可以是指向某一内在空间的指针;v为要填充的值;n为要填充的字节数,通常为sizeof(s);使用memset......
  • Collection - PriorityQueue源码解析
    前面以JavaArrayDeque为例讲解了Stack和Queue,其实还有一种特殊的队列叫做PriorityQueue,即优先队列。优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素)。这里牵涉到了大小关系,元素大小的评判可以通过元素本身......