python爬虫-数据解析BeautifulSoup

news/2024/7/19 10:13:05 标签: python, 爬虫, beautifulsoup

1、基本简介

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

BeautifulSoup和lxml类似,既可以解析本地文件也可以响应服务器文件。

缺点:效率没有lxml的效率高 。

优点:接口设计人性化,使用方便。

2、安装

pip install bs4

3、基本语法

一、 节点定位
1. 根据标签名查找节点
        soup.a 【注】只能找到第一个 a
                soup.a.name
                soup.a.attrs
2. 函数
        (1).find(返回一个对象 )
                find('a'):只找到第一个a 标签
                find('a', title='名字')
                find('a', class_='名字')
        (2).find_all(返回一个列表 )
                find_all('a') 查找到所有的a
                find_all(['a', 'span']) 返回所有的a 和 span
                find_all('a', limit=2) 只找前两个a
        (3).select(根据选择器得到节点对象 ) 【推荐】
                1.element
                        eg:p
                2..class
                        eg:.firstname
                3.#id
                        eg:#firstname
                4.属性选择器
                        [attribute]
                                eg:li = soup.select('li[class]')
                        [attribute=value]
                                eg:li = soup.select('li[class="hengheng1"]')
                5.层级选择器
                        element element
                                div p
                        element>element
                                div>p
                        element,element
                                div,p
                                eg:soup = soup.select('a,span')
二、节点信息
(1). 获取节点内容:适用于标签中嵌套标签的结构
        obj.string
        obj.get_text()【推荐】
(2). 节点的属性
        tag.name 获取标签名
                eg:tag = find('li)
        print(tag.name)
                tag.attrs将属性值作为一个字典返回
(3). 获取节点属性
        obj.attrs.get('title')【常用】
        obj.get('title')
        obj['title']

 python代码:

python">from bs4 import BeautifulSoup
 
# 通过解析本地文件 对bs4基础语法进行熟悉
# 默认打开的编码格式是gbk 所以在打开文件的时候需要指定编码
soup = BeautifulSoup(open('6.html',encoding='utf-8'),'lxml')
 
# 根据标签名查找节点
# 注意找到的是第一个符合条件的信息
print(soup.a)
# attrs 获取标签的属性和属性值
print(soup.a.attrs)
 
# bs4的函数
# (1) find      返回第一个符合条件的数据
print(soup.find('a'))
# 根据title找到对应的标签对象
print(soup.find('a',title="a2"))
# 根据class的值找到对应的标签对象    注意的是class需要添加下划线
print(soup.find('a',class_="a1"))
 
# (2) find_all      返回的是一个列表,并且返回所有的a标签
print(soup.find_all('a'))
# 如果想要获取的是多个标签的数据,那么需要在find_all的参数中添加的是列表的数据
print(soup.find_all(['a','span']))
# limit的作用是查找前几个数据
print(soup.find_all('li',limit=2))
 
# (3) select(推荐)        返回的是一个列表,并且返回多个数据
print(soup.select('a'))
# 可以通过 . 代表class    我们把这种操作叫做类选择器
print(soup.select('.a1'))
# 可以通过 # 代表id
print(soup.select('#l1'))
 
# 属性选择器     通过属性来寻找对应的标签
# 查找到li标签中有id的标签
print(soup.select('li[id]'))
# 查找到li标签中id为l2的标签
print(soup.select('li[id="l2"]'))
 
# 层级选择器
#   后代选择器
# 找到的是div下面的li
print(soup.select('div li'))
 
#   子代选择器
# 某标签的第一级子标签
# 注意:很多的计算机编程语言中不加空格就不会输出内容,但是bs4中不会报错,会显示内容
print(soup.select('div > ul > li'))
# 找到a标签和li标签的所有的对象
print(soup.select('a,li'))
 
 
# 节点信息
#   获取节点内容
obj = soup.select('#d1')[0]
# 如果标签对象中只有内容,那么string和get_text()都可以使用
# 如果标签对象中除了内容还有其他标签 那么string就获取不到数据,get_text()可以获取到数据
# 一般情况下推荐使用get_text()
print(obj.string)
print(obj.get_text())
 
# 节点的属性
obj = soup.select('#p1')[0]
# name是标签的名字
print(obj.name)
# 将属性值作为一个字典返回
print(obj.attrs)
 
# 获取节点的属性
obj = soup.select('#p1')[0]
print(obj.attrs.get('class'))
print(obj.get('class'))
print(obj['class'])

4、案例:星巴克

 需求:爬取星巴克官网中的产品名称。

        网页中找到星巴克的接口

python代码:

python">import urllib.request
from bs4 import BeautifulSoup
 
url = 'https://www.starbucks.com.cn/menu/'
 
response = urllib.request.urlopen(url)
 
content = response.read().decode('utf-8')
 
soup = BeautifulSoup(content,'lxml')
 
# //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())

 


http://www.niftyadmin.cn/n/4993594.html

相关文章

VS + qt环境使用QCustomPlot等三方库如何配置

文章目录 前言VS环境下引入第三方类库QCustomPlot方法一:解决办法: C中.dll与.lib文件的生成与使用1. 两种库:2.两种文件的区别 前言 Qt提供了显式和隐式导入第三方库方法,本文只介绍显示导入方法。 一般的第三方提供的库文件包…

小白学Go 基础02-了解Go语言的诞生与演进

Go语言诞生于何时?它的最初设计者是谁?它为什么被命名为Go?它的设计目标是什么?它如今发展得怎么样?带着这些问题,我们一起穿越时空,回到2007年9月Go语言诞生的那一历史时刻吧。 Go语言的诞生 …

无涯教程-JavaScript - LOGINV函数

LOGINV函数替代Excel 2010中的LOGNORM.INV函数。 描述 该函数返回x的对数正态累积分布函数的逆函数,其中ln(x)的分布通常带有参数mean和standard_dev。 如果pLOGNORMDIST(x,...),则LOGINV(p,...) x 使用对数正态分布来分析对数转换的数据。 语法 LOGINV (probability, me…

leetcode分类刷题:哈希表(Hash Table)(二、数组交集问题)

1、当需要快速判断某元素是否出现在序列中时,就要用到哈希表了。 2、本文针对的总结题型为给定两个及多个数组,求解它们的交集。接下来,按照由浅入深层层递进的顺序总结以下几道题目。 3、以下题目需要共同注意的是:对于两个数组&…

QT中信号与槽机制的介绍,以及信号与槽连接的几种方式

信号与槽机制 信号与槽的介绍 功能:实现多个组件之间的相互通信,是QT引以为傲的核心机制信号:就是信号函数,定义在类体的signals权限下,是一个不完整的函数,只有声明没有定义;槽:就…

『SpringBoot 源码分析』run() 方法执行流程:(2)刷新应用上下文-准备阶段

『SpringBoot 源码分析』run() 方法执行流程:(2)刷新应用上下文-准备阶段 基于 2.2.9.RELEASE问题:当方法进行了注释标记之后,springboot 又是怎么注入到容器中并创建类呢? 首先创建测试主程序 package …

设计模式-5--适配器模式(Adapter Pattern)

一、什么是适配器模式(Adapter Pattern) 适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。适配器模式主要用于解决不兼容接口之间的问题,使得原本…

Splunk目录结构及常用配置文件

Splunk目录结构及常用配置文件 并没有将所有目录罗列出来,了解了解个别文件目录,知道一下功能混个面熟 $SPLUNK_HOME目录:这是Splunk安装目录的根路径,一般是/opt/splunk,其中包含Splunk的配置文件、日志文件、插件和其…