BeautifulSoup模块

目录

BS4的4中对象

基本使用

查找标签

用CSV保存数据


        Beautiful Soup 库一般被称为bs4库,支持Python3,是我们写爬虫非常好的第三方库。因用起来十分的简便流畅。所以也被人叫做“美味汤”。目前bs4库的最新版本是4.40。下文会介绍该库的最基本的使用,具体详细的细节还是要看:[官方文档](Beautiful Soup Documentation)

        Python的强大之处就在于他作为一个开源的语言,有着许多的开发者为之开发第三方库,这样我们开发者在想要实现某一个功能的时候,只要专心实现特定的功能,其他细节与基础的部分都可以交给库来做。bs4库 就是我们写爬虫强有力的帮手。

事实上,bs4库 是解析、遍历、维护、“标签树“的功能库。

BS4的4中对象

  • Tag对象:是html中的一个标签,用BeautifulSoup就能解析出来Tag的具体内容,具体的格式为‘soup.name‘,其中name是html下的标签。
  • BeautifulSoup对象:整个html文本对象,可当作Tag对象
  • NavigableString对象:标签内的文本对象
  • Comment对象:是一个特殊的NavigableString对象,如果html标签内存在注释,那么它可以过滤掉注释符号保留注释文本
  • 最常用的还是BeautifulSoup对象和Tag对象

基本使用

# 1 安装
# pip install bs4
# pip install lxml

# 2 导包
# from bs4 import BeautifulSoup

# 3 创建bs对象
# soup = BeautifulSoup(网页源码,解析器)

# 4 调用需要的方法提取数据 find\findall

from bs4 import BeautifulSoup

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<b><!-- Elsie --></b>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""


# 类型为<class 'bs4.BeautifulSoup'> bs对象
soup = BeautifulSoup(html_doc,'lxml')

# 格式化
# print(soup.prettify())

# 提取出第一个a标签
# 类型为<class 'bs4.element.Tag'> 标签
a = soup.a  # a是标签名
print(a)

# print(type(a))

# 打印标签名
print(a.name)

# 提取出标签之间的文本
# 类型为 <class 'bs4.element.NavigableString'> 文本数据
print(a.string)
str1 = a.string + 'aaa'
print(str1)

# 提取出标签的属性
print(a.get('class')[0])
print(a['class'])


# 注释
b = soup.b

print(b.string)

# BeautifulSoup(html_doc,'lxml') <class 'bs4.BeautifulSoup'> bs对象
# soup.a <class 'bs4.element.Tag'> 标签
# a.string <class 'bs4.element.NavigableString'> 文本数据

查找标签

# 取别名
from bs4 import BeautifulSoup as bs

html = """
<table class="tablelist" cellpadding="0" cellspacing="0">
    <tbody>
        <tr class="h">
            <td class="l" width="374">职位名称</td>
            <td>职位类别</td>
            <td>人数</td>
            <td>地点</td>
            <td>发布时间</td>
        </tr>
        <tr class="even">
            <td class="l square"><a target="_blank" href="position_detail.php?id=33824&keywords=python&tid=87&lid=2218">22989-金融云区块链高级研发工程师(深圳)</a></td>
            <td>技术类</td>
            <td>1</td>
            <td>深圳</td>
            <td>2017-11-25</td>
        </tr>
        <tr class="odd">
            <td class="l square"><a target="_blank" href="position_detail.php?id=29938&keywords=python&tid=87&lid=2218">22989-金融云高级后台开发</a></td>
            <td>技术类</td>
            <td>2</td>
            <td>深圳</td>
            <td>2017-11-25</td>
        </tr>
        <tr class="even">
            <td class="l square"><a target="_blank" href="position_detail.php?id=31236&keywords=python&tid=87&lid=2218">SNG16-腾讯音乐运营开发工程师(深圳)</a></td>
            <td>技术类</td>
            <td>2</td>
            <td>深圳</td>
            <td>2017-11-25</td>
        </tr>
        <tr class="odd">
            <td class="l square"><a target="_blank" href="position_detail.php?id=31235&keywords=python&tid=87&lid=2218">SNG16-腾讯音乐业务运维工程师(深圳)</a></td>
            <td>技术类</td>
            <td>1</td>
            <td>深圳</td>
            <td>2017-11-25</td>
        </tr>
        <tr class="even">
            <td class="l square"><a target="_blank" href="position_detail.php?id=34531&keywords=python&tid=87&lid=2218">TEG03-高级研发工程师(深圳)</a></td>
            <td>技术类</td>
            <td>1</td>
            <td>深圳</td>
            <td>2017-11-24</td>
        </tr>
        <tr class="odd">
            <td class="l square"><a target="_blank" href="position_detail.php?id=34532&keywords=python&tid=87&lid=2218">TEG03-高级图像算法研发工程师(深圳)</a></td>
            <td>技术类</td>
            <td>1</td>
            <td>深圳</td>
            <td>2017-11-24</td>
        </tr>
        <tr class="even">
            <td class="l square"><a target="_blank" href="position_detail.php?id=31648&keywords=python&tid=87&lid=2218">TEG11-高级AI开发工程师(深圳)</a></td>
            <td>技术类</td>
            <td>4</td>
            <td>深圳</td>
            <td>2017-11-24</td>
        </tr>
        <tr class="odd">
            <td class="l square"><a target="_blank" href="position_detail.php?id=32218&keywords=python&tid=87&lid=2218">15851-后台开发工程师</a></td>
            <td>技术类</td>
            <td>1</td>
            <td>深圳</td>
            <td>2017-11-24</td>
        </tr>
        <tr class="even" id="aaa">
            <td class="l square"><a target="_blank" href="position_detail.php?id=32217&keywords=python&tid=87&lid=2218">15851-后台开发工程师</a></td>
            <td>技术类</td>
            <td>1</td>
            <td>深圳</td>
            <td>2017-11-24</td>
        </tr>
        <tr class="odd">
            <td class="l square"><a id="test" class="test" target='_blank' href="position_detail.php?id=34511&keywords=python&tid=87&lid=2218">SNG11-高级业务运维工程师(深圳)</a></td>
            <td>技术类</td>
            <td>1</td>
            <td>深圳</td>
            <td>2017-11-24</td>
        </tr>
    </tbody>
</table>
"""


soup = bs(html,'lxml')

# 1 提取出所有tr标签
tr_list = soup.find_all('tr')

# for tr in tr_list:
#     print(tr)
#     print('-'*100)

# 2 提取出第二tr标签

# print(tr_list[1])

# 3 提取出class='even'的tr标签 limit设置提取数量
# tr_list1 = soup.find_all('tr',class_='even',limit=3)
# for tr in tr_list1:
#     print(tr)
#     print('-' * 100)


# tr_list1 = soup.find_all('tr',attrs={'class':'even','id':'aaa'})
# for tr in tr_list1:
#     print(tr)
#     print('-' * 100)

# 4 获取所有a标签的href属性
# a_list = soup.find_all('a')
# for a in a_list:
#     # print(a['href'])
#     print(a.get('href'))
#     print('-' * 100)

# 5 获取所有职位信息
a_list1 = soup.find_all('a',target="_blank")

# for a in a_list1:
#     print(a.string)
#     print('-' * 100)

用CSV保存数据

import csv
persons = [
    {'name': '笔记本', 'age': 18, 'height': 175},
    {'name': '张同学', 'age': 18, 'height': 175},
    {'name': '杨同学', 'age': 18, 'height': 175},
]
# newline='' 去除空行 encoding='utf-8-sig'去除乱码
headers = ['name','age','height']
with open('item.csv','w',encoding='utf-8-sig',newline='')as f:
    # 把普通的open方法变为写入csv的方法
    # DictWriter多传入一个表头参数
    dict_writer = csv.DictWriter(f,headers)
    # dict_writer.writeheader() 写入表头
    dict_writer.writeheader()
    # 写入二维数据
    dict_writer.writerows(persons)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

依恋、阳光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值