BeautifulSoup 解析数据

一、BeautifulSoup概述

1.BeautifulSoup

  • 是一个可以从HTML或XML文档中提取数据的Python库
  • 功能简单强大、容错能力高、文档相对完善,清晰易懂
  • 非Python标准模块,需要安装才能使用

2.安装方式

  • pip install bs4 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

3.测试方式

  • import bs4

4.解析器

BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果不安装第三方解析器,则Python会使用默认解析器

(1)标准库

  • 使用方法:BeautifulSoup(html,‘html.parser’)
  • 优点:内置标准库,速度适中,文档容错能力强
  • 缺点:Python3.2版本前的文档容错能力差

(2)lxml HTML

  • 使用方法:BeautifulSoup(html,‘lxml’)
  • 优点:速度快,文档容错能力强
  • 缺点:安装C语言库

(3)lxml XML

  • 使用方法:BeautifulSoup(html,‘xml’)
  • 优点:速度快,唯一支持XML
  • 缺点:安装C语言库

(4)html5lib

  • 使用方法:BeautifulSoup(html,‘html5lib’)
  • 优点:容错能力最强,可生成HTML5
  • 缺点:运行慢,扩展差

二、代码创建bs4对象

from bs4 import BeautifulSoup#待解析的文档
html = '''<html><head><title>水面清圆</title></head><body><h1 class = 'cur book' float = 'left'>一一风荷举</h1><a href = 'http://www.baidu.com'></a><h2><!--这里是注释--></h2></body></html>
'''#选择一个解析器,创建bs对象
bs = BeautifulSoup(html,'lxml')
#获取标签
print(bs.title)
#获取h1标签的所有属性 列表形式存放多个属性值
print(bs.h1.attrs)
#获取单个属性
print(bs.h1.get('class')) #写法1
print(bs.h1['class'])     #写法2
#获取属性值
print(bs.a['href'])
#获取文本
print(bs.title.text)
print(bs.title.string)#获取内容
print('text:',bs.h2.text)  #仅获取文本内容
print('string:',bs.h2.string)  #获取到h2标签中的所有内容
<title>水面清圆</title>
{'class': ['cur', 'book'], 'float': 'left'}
['cur', 'book']
['cur', 'book']
http://www.baidu.com
水面清圆
水面清圆
text:
string: 这里是注释Process finished with exit code 0

三、BS提取数据常用方法

(一)find()方法

  • 1.返回值类型:Tag
  • 2.功能:提取满足要求的首个数据
  • 3.语法:bs.find(标签,属性)
  • 4.举例:bs.find(‘div’,class_=‘books’)

(二)find_all()方法

  • 1.返回值类型:Tag
  • 2.功能:提取满足要求的所有数据
  • 3.语法:bs.find_all(标签,属性)
  • 4.举例:bs.find_all(‘div’,class_=‘books’)

(三)CSS选择器

  • 1.通过ID查找:bs.select(’#abc’)
  • 2.通过classa查找:bs.select(’.abc’)
  • 3.通过属性查找:bs.select(a[‘class=“abc”’])

(四)Tag对象

  • 1.获取标签:bs.title
  • 2.获取所有属性:bs.title.attrs
  • 3.获取单个属性的值:
    写法1: bs.div.get(‘class’)
    写法2: bs.div.[‘class’]
    写法3: bs.a(‘href’)

代码实现

from bs4 import  BeautifulSoup
#待解析的文档
html = '''<title>晴空一鹤排云上</title><div class = 'info' float = 'left'>便引诗情到碧霄</div><div class = 'info' float = 'right' id = 'gb'><span>好好学习,天天向上</span><a href = 'http://www.baidu.com'></a></div><span>我是第二个span</span>'''
#解析数据
bs = BeautifulSoup(html,'lxml')
#获得Tag对象
print(bs.title,type(bs.title))print('\n--------------bs.find()方法------------------------')
#bs.find()方法:获取满足条件的第一个标签,其类型也为Tag
print(bs.find('div',class_='info'),type(bs.find('div',class_='info')))print('\n--------------bs.find_all()方法------------------------')
#bs.find_all()方法:获取满足条件的所有标签,返回的是一个标签列表
print(bs.find_all('div',class_='info'),type(bs.find_all('div',class_='info')))print('\n-----------------------遍历每一个标签---------------------')
for item in bs.find_all('div',class_ = 'info'):print(item,type(item))print('\n--------------获取属性--------------------')
print(bs.find_all('div',attrs={'float':'right'}))print('\n---------------CSS选择器---------------------')
print(bs.select('#gb'))
print('\n------------------------------------------------')
print(bs.select('.info'))print('\n--------------获取div标签下的span标签--------------------------')
print(bs.select('div>span'))print('\n------------------------------------------------')
print(bs.select('div.info>span'))print('\n------------------获取标签中的文本内容------------')
for item in bs.select('div.info>span'):print(item.text)
<title>晴空一鹤排云上</title> <class 'bs4.element.Tag'>--------------bs.find()方法------------------------
<div class="info" float="left">便引诗情到碧霄</div> <class 'bs4.element.Tag'>--------------bs.find_all()方法------------------------
[<div class="info" float="left">便引诗情到碧霄</div>, <div class="info" float="right" id="gb">
<span>好好学习,天天向上</span>
<a href="http://www.baidu.com"></a>
</div>] <class 'bs4.element.ResultSet'>-----------------------遍历每一个标签---------------------
<div class="info" float="left">便引诗情到碧霄</div> <class 'bs4.element.Tag'>
<div class="info" float="right" id="gb">
<span>好好学习,天天向上</span>
<a href="http://www.baidu.com"></a>
</div> <class 'bs4.element.Tag'>--------------获取属性--------------------
[<div class="info" float="right" id="gb">
<span>好好学习,天天向上</span>
<a href="http://www.baidu.com"></a>
</div>]---------------CSS选择器---------------------
[<div class="info" float="right" id="gb">
<span>好好学习,天天向上</span>
<a href="http://www.baidu.com"></a>
</div>]------------------------------------------------
[<div class="info" float="left">便引诗情到碧霄</div>, <div class="info" float="right" id="gb">
<span>好好学习,天天向上</span>
<a href="http://www.baidu.com"></a>
</div>]--------------获取div标签下的span标签--------------------------
[<span>好好学习,天天向上</span>]------------------------------------------------
[<span>好好学习,天天向上</span>]------------------获取标签中的文本内容------------
好好学习,天天向上Process finished with exit code 0

四、案例

爬取淘宝网首页

import requests
from bs4 import BeautifulSoup#请求的URL:淘宝网首页
url = 'https://uland.taobao.com/'
#加入请求头
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'}
#发送请求
resp = requests.get(url,headers)
#返回一个HTML文档#创建一个bs对象,解析返回的HTML文档
bs = BeautifulSoup(resp.text,'lxml')
#查询所有的a标签
a_list = bs.find_all('a')
#遍历每个a标签,以获取其href的属性值
for a in a_list:url = a.get('href')#print(url)if url == None:    #去掉href为空值的标签属性continueif url.startswith('http') or url.startswith('https'):  #获取以HTTP或HTTPS开头的完整网址print(url)

输出结果为可以跳转的链接

https://s.click.taobao.com/t?union_lens=lensId%3AOPT%401601203401%400b0f99df_a5b3_174cf28f3bb_ad79%4001%3BeventPageId%3A20150318020000648&e=m%3D2%26s%3Diaj%2F%2FMChDMNw4vFB6t2Z2iperVdZeJviePMclkcdtjxyINtkUhsv0K5mYvcBEhv8U9RX0Iw%2BkeJD415GGSsrJ4YxhNUZ2i3GTlT4SLzYDiBT2M421%2BABgTvflh4%2Fhqj89CGjsatFbg%2FkxFiXT%2FI5kdHG0mETTJw4I%2FQKsMyWv9lyeNAoQluSar7Bu%2FpJjtAXjXL88Z9Mt2nGDmntuH4VtA%3D%3D&pid=mm_0_0_0
https://s.click.taobao.com/t?union_lens=lensId%3AOPT%401602583439%400b5dc12f_df39_175216aa7d3_3ba4%4001%3BeventPageId%3A20150318020000813&e=m%3D2%26s%3DVSDHOXPRC4YcQipKwQzePCperVdZeJviePMclkcdtjxyINtkUhsv0LByEUqSWs8wxHXUNZRa3F5D415GGSsrJ4YxhNUZ2i3GTlT4SLzYDiBT2M421%2BABgTvflh4%2Fhqj89CGjsatFbg%2FkxFiXT%2FI5kdv2ej9RFznDujXyQ8P5hEAW95D0t3aOisosmJjNa%2FrGYpyF7ku%2BxKjfv8uao0UzJSWcMOnOtXCYRnn6ynij93lsDvbh8Qt7h%2F7mglw2LhJ8IdKpkygapz%2FOumdbRSBMWogPh2VpbvcT8PwOkD4ulZfxvNaaibhIncDlE6H93yEw17wnkme1OdGDcT9IgYeWFwpobexl%2Fx%2FZ&pid=mm_0_0_0
https://s.click.taobao.com/t?union_lens=lensId%3AOPT%401600161414%400b59e276_31e8_174910d7ee5_1434%4001%3BeventPageId%3A20150318020000406&e=m%3D2%26s%3D5LNEiCktsG5w4vFB6t2Z2iperVdZeJviePMclkcdtjxyINtkUhsv0KBG0TwCFKWFemLun%2Boqc%2FVD415GGSsrJ4YxhNUZ2i3GTlT4SLzYDiBT2M421%2BABgTvflh4%2Fhqj89CGjsatFbg%2FkxFiXT%2FI5kdv2ej9RFznDujXyQ8P5hEAW95D0t3aOisosmJjNa%2FrGraOxjvWhHnYV5fRYrrSW6WwO9uHxC3uHfE%2BH0gbC0KpkDV443qLdLqxZ2nVWPAAw2n9Az55wlDRExsN3p515W%2FKamps88B8EQWLobdpSETDGDF1NzTQoPw%3D%3D&&pid=mm_0_0_0
https://s.click.taobao.com/t?union_lens=lensId%3AOPT%401602583439%400b1a25d9_3fc2_175216aa7eb_ac58%4001%3BeventPageId%3A20150318020000814&e=m%3D2%26s%3D3q2KSPwGXwYcQipKwQzePCperVdZeJviePMclkcdtjxyINtkUhsv0LByEUqSWs8wxHXUNZRa3F5D415GGSsrJ4YxhNUZ2i3GTlT4SLzYDiBT2M421%2BABgTvflh4%2Fhqj89CGjsatFbg%2FkxFiXT%2FI5kdv2ej9RFznDujXyQ8P5hEAW95D0t3aOisosmJjNa%2FrGYpyF7ku%2BxKjfv8uao0UzJSWcMOnOtXCYRnn6ynij93lsDvbh8Qt7h%2F7mglw2LhJ8IdKpkygapz8i98XAIvg9KYgPh2VpbvcT8PwOkD4ulZfxvNaaibhIncDlE6H93yEw17wnkme1OdGDcT9IgYeWFwpobexl%2Fx%2FZ&pid=mm_0_0_0
https://www.etao.com/cjfl/info.htm?activityId=1495387
https://s.click.taobao.com/t?e=m%3D2%26s%3DaCBbXzf6%2Bp8cQipKwQzePDAVflQIoZepK7Vc7tFgwiFRAdhuF14FMTCw9kUE1PCMaqAeRGk4m9Lb6q32bH9H5L2YnZ7gs%2Faz&pid=mm_0_0_0
https://mo.m.taobao.com/union/live?pid=mm_0_0_0Process finished with exit code 0

Python学习 Day43 数据解析-BeautifulSoup 07相关推荐

  1. Python 爬虫 xpath 数据解析基本用法

    Python 爬虫 xpath 数据解析基本用法 1. 基本语法 1.1 解析 html 语法 1.2 获取标签 1.3 获取标签中的内容 1.4 获取标签中的属性 1.5 通过内容寻找结点 2. 实 ...

  2. Python爬虫 之数据解析之bs4

    数据解析之bs4 一.bs4进行数据解析 二.bs4库和lxml库的安装 三.BeautifulSoup对象 四.项目实例 一.bs4进行数据解析 1.数据解析的原理 ① 标签定位. ② 提取标签.标 ...

  3. python层级抓取_070.Python聚焦爬虫数据解析

    一 聚焦爬虫数据解析 1.1 基本介绍 聚焦爬虫的编码流程 指定url 基于requests模块发起请求 获取响应对象中的数据 数据解析 进行持久化存储 如何实现数据解析 三种数据解析方式 正则表达式 ...

  4. 【网络爬虫】python中的数据解析工具(re,bs4,xpath,pyquery)

    1.基础知识 1.1 正则(re) Regular Expression, 正则表达式, ⼀种使⽤表达式的⽅式对字符进⾏匹配的语法规则. ⽹⻚源代码本质上就是⼀个超⻓的字符串, 想从⾥⾯提取内容.⽤正 ...

  5. 【Python】json数据解析

    目录 json文件数据解析 爬虫获取王者荣耀英雄信息json数据包并解析 爬虫获取抖音视频json数据包并解析 json文件数据解析 json字符串:通常类似python数据类型中的列表和字典的结合, ...

  6. python学习(二) ElementTree解析、读写、创建xml文件

    python学习(二) 读写xml文件 1.xml格式 将其存储为sample.xml  Tag:使用<>包围的部分  Element:被Tag包围的部分,例如22中的22  Attrib ...

  7. python猫眼top数据解析画图

    猫眼top100数据解析 这是继上篇爬取数据后的数据解析,且尝试使用更多种方法去抓取.存储数据.上篇链接为link 抓取数据方法介绍 1.利用正则表达式解析 def parse_one_page(ht ...

  8. Python学习:数据类型转换的方法教程

    1.type() 函数 使用 type() 函数可以查看数据类型. 示例: >>> type(123) <class 'int'> >>> type(1 ...

  9. Python爬虫之数据解析/提取(二)

    文章目录 前言 数据分析分类 数据解析原理概述 一.正则re进行数据解析 1.1 爬取糗事百科中糗图板块下所有的糗图图片⭐ 二.bs4解析概述 2.1 获取整个标签 2.2 获取标签属性或者存储的文本 ...

最新文章

  1. WSAGetLastError:10004 一个封锁操作被对 WSACancelBlockingCall的调用中断 的解决
  2. 已被管理员、加密政策或凭据存储停用
  3. 【待继续研究】解析信用评分模型的开发流程及检验标准(晕乎乎,看不懂~)
  4. 一步一步学Ruby(二十一):文件操作2
  5. 数据结构——进制转换(10—n)
  6. 从零开始学Pytorch(十五)之数据增强
  7. (52)Xilinx差分原语-IBUFGDS与OBUFGDS(第11天)
  8. LINUX文件处理命令
  9. html keyframes无效,@ -webkit-keyframes动画为什么不起作用?
  10. 阶段3 2.Spring_04.Spring的常用注解_7 改变作用范围以及和生命周期相关的注解
  11. Druid手动创建连接的坑
  12. [Gamma阶段]第四次Scrum Meeting
  13. 64位Windows2003下如何正确发布VesnData.Net(VDN)
  14. centos下装redis
  15. Uncaught Error: Rendered fewer hooks than expected. This may be caused by an accidental early return
  16. hdu3911 Black And White (线段树/区间合并)
  17. SQL笔试题目分享(一)
  18. Primitives vs Objects
  19. Javascript ajax封装 并重载
  20. 键盘钢琴html代码,Flash键盘钢琴 电脑键盘钢琴附键盘钢琴谱

热门文章

  1. 《了不起的盖茨比》----走出绿灯困境
  2. 从原型图到成品:步步深入CSS布局
  3. windows和linux服务器哪个好?有哪些区别?
  4. crh寄存器_寄存器简写
  5. load json文件时常见错误以及修正总结(亲测有效)
  6. iOS图片转成视频方法
  7. quectel模块增加发送功率流程
  8. ios13全选手势_iOS13大揭秘:深色模式、多任务、新手势等
  9. 情感日记:东部华侨城
  10. Linux宝塔控制面板如何实现多个二级域名301重定向跳转