ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据解析基础之BeautifulSoup

2021-05-04 10:32:53  阅读:158  来源: 互联网

标签:标签 BeautifulSoup soup 文档 print 解析 数据 加载


一、BeautifulSoup库

  • Beautiful Soup 提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。 Beautiful Soup 自动将输入文档转换为 Unicode 编码,输出文档转换为 utf-8 编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup 就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。 Beautiful Soup 已成为和 lxml、html6lib 一样出色的 python 解释器,为用户灵活地提供不同的解析策略或强劲的速度。
  • 简单来说,就是可以方便的处理HTML/XML页面源码,提取我们需要的标签信息。

1.1、bs4数据解析的原理

  • 实例化一个BeautifulSoup对象,并且将页面源代码数据加载到该对象中。
  • 通过调用BeautifulSoup对象中相关的属性或者方法进行标签定位和数据提取。

1.2、bs4环境安装

下载BeautifulSoup包
# pip install bs4

下载lxml包
pip install lxml

二、bs4简单使用示例

2.1、实例化BeautifulSoup对象

# 1、首先导包
from bs4 import BeautifulSoup

# 2、实例化BeautifulSoup对象,数据加载到该对象中分为两种 :将本地的HTML文档数据加载到该对象中 / 将网络请求响应的页面源码加载到该对象中

# 将本地的HTML文档数据加载到该对象中
fp = open('./test.html', 'r', encoding='utf-8')
soup = BeautifulSoup(fp, 'lxml')


# 将网络请求响应的页面源码加载到该对象中
# page_text = response.text
# soup = BeatuifulSoup(page_text, 'lxml')

2.2、bs4 常用的方法和属性

  • soup.tagName:返回文档中第一次出现的tagName对应的标签名称
  • soup.find()
    • find('tagName'),等同于soup.div
    • 属性定位:soup.find('div', class_/id/attribution='value')。前一个参数表示标签名,后一个参数表示该标签的属性值。
  • soup.find_all():返回找到的所有结果,列表类型
  • select
    • select('某种选择器(id, class, 标签...选择器)'),返回一个列表
    • 层级选择器:soup.select('.test > ul > li > a'),其中>表示一个层级,空格 表示多个层级,所有上面语句就是选择属性值为test的标签单个层级下的ul标签单层下的li标签下的a标签。
  • 获取标签之间的文本数据
    • soup.a.text/string/get_test(),表示搜索所有a标签中的文本
    • text/get_text():可以获取某个标签中所有的文本内容
    • string:只可以获取该标签下直系的文本内容

2.3、实战示例

  • 首先编写test.html文件,内容如下 : 用于将本地的HTML文档数据加载到该对象中;
// test.html

<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>测试bs4</title>
</head>
<body>
    <div>
        <p>百里守约</p>
    </div>
    <div class="song">
        <p>李清照</p>
        <p>王安石</p>
        <p>苏轼</p>
        <p>柳宗元</p>
        <a href="http://www.song.com" title="赵匡胤" target="_self">
            <span>this is span</span>
            宋朝是强大的王朝,不是军队的强大,而是经济很强大。
        </a>
        <a href="" class="du">总为浮云能蔽日,长安不见使人愁</a>
        <img src="http://www.baidu.com/meiny.jpg" alt="" />
    </div>
    <div class="tang">
        <ul>
            <li><a href="http://www.baidu.com" title="qing">清明时节雨纷纷,路上行人欲断魂</a> </li>
            <li><a href="http://www.163.com" title="qing">清明时节雨纷纷,路上行人欲断魂</a> </li>
            <li><a href="http://www.126.com" title="qin">秦时明月汉时关,万里长征人未还</a> </li>
            <li><a href="http://www.sina.com" title="qi">岐王宅里寻常见,崔九堂前几度闻</a> </li>
            <li><a href="http://www.aaa.com" title="lu">杜甫</a> </li>
            <li><b>leo</b> </li>
            <li><i>风雨寒</i> </li>
            <li><a href="http://www.baidu.com" title="feng">凤凰台上凤凰游,凤去台空江自流</a> </li>
        </ul>
    </div>
</body>
</html>
  • 使用基础的方法
# 1、首先导包
from bs4 import BeautifulSoup

# 2、实例化BeautifulSoup对象,数据加载到该对象中分为两种 :将本地的HTML文档数据加载到该对象中 / 将网络请求响应的页面源码加载到该对象中
# 将本地的HTML文档数据加载到该对象中
fp = open('./test.html', 'r', encoding='utf-8')
soup = BeautifulSoup(fp, 'lxml')

# 3、常用方法示例
# print(soup)
print(soup.a) # soup.tagName 返回第一次出现的标签内容
print(soup.div)
print(soup.find('div'))
print(soup.find('div',class_='song'))
print(soup.select('.tang > ul > li > a')[0])
print(soup.select('.tang > ul > li > a')[0].text)
print(soup.select('.tang > ul > li > a')[0]['href'])
  • 执行结果
<a href="http://www.song.com" target="_self" title="赵匡胤">
<span>this is span</span>
            宋朝是强大的王朝,不是军队的强大,而是经济很强大。
        </a>
<div>
<p>百里守约</p>
</div>
<div>
<p>百里守约</p>
</div>
<div class="song">
<p>李清照</p>
<p>王安石</p>
<p>苏轼</p>
<p>柳宗元</p>
<a href="http://www.song.com" target="_self" title="赵匡胤">
<span>this is span</span>
            宋朝是强大的王朝,不是军队的强大,而是经济很强大。
        </a>
<a class="du" href="">总为浮云能蔽日,长安不见使人愁</a>
<img alt="" src="http://www.baidu.com/meiny.jpg"/>
</div>
<a href="http://www.baidu.com" title="qing">清明时节雨纷纷,路上行人欲断魂</a>
清明时节雨纷纷,路上行人欲断魂
http://www.baidu.com

标签:标签,BeautifulSoup,soup,文档,print,解析,数据,加载
来源: https://www.cnblogs.com/dai-zhe/p/14728986.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有