数据解析基础之BeautifulSoup

一、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
posted @ 2021-05-04 10:13  SRE运维充电站  阅读(124)  评论(0编辑  收藏  举报