python爬虫第九讲- bs4上

bs4的概述

bs4是什么?
BeautifulSoup4简单理解就是一个可以从HTML或XML文件中提取数据的网页信息提取库
有什么作用?
提取和解析网页中的数据
学习的意义?
随着我们技术的增长 你遇到的网站会越来越多 去寻找最适合解决这个网站的技术
正则 正则表达式不好写 容易出错
xpath 需要记住一些语法
bs4 只需要我们记住一些方法就可以啦

如何学习?
1 提供了中文的学习文档
2 在整个的bs4模块当中需要我们掌握的是 BeautifulSoup这个核心类
3 在这个核心类当中封装了一些方法 那么这些方法就是我们本堂课的学习目标
拓展
C Class类
m Method 方法
f Field 字段
p Poperty装饰器

官网
4.90文档

bs4快速入门

如何入门?
1 安装
pip install lxml
pip install bs4

2 导入
from bs4 import BeautifulSoup

3 创建soup对象
soup = BeautifulSoup(tag)

4 根据需求调用方法
例如 soup.find() / soup.find_all()

from bs4 import BeautifulSoup

html_doc = """<html><head><title>The Dormouse's story</title></head>
<body>
<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>
"""

soup = BeautifulSoup(html_doc, features='lxml')
# print(soup.prettify())  # 打印出html格式化文档
# print(soup.title)  # <title>The Dormouse's story</title>
# print(soup.title.string)  # The Dormouse's story
# print(soup.find_all("p"))  # 找到所有p标签,返回一个列表

# 找到href对应的网址
for i in soup.find_all("a"):
    print(i.get("href"))

bs4的对象种类

tag : 标签
NavigableString : 可导航的字符串
BeautifulSoup : soup对象
Comment : 注释

遍历文档树

# print(soup.strings)  # 生成一个迭代器对象 <generator object Tag._all_strings at 0x0000020EA20CD2E0>
# for i in soup.strings:
#     print(i)  # 显示所有字符串 包括空格

for i in soup.stripped_strings:  # 去空格
    print(i)

find()和find_all()方法

  • 字符串过滤器
    soup.find(“p”)
    soup.find_all(“a”)
  • 列表过滤器
    print(soup.find_all([“p”, “a”])) # 同时找到p和a标签
from bs4 import BeautifulSoup
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">
            <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 = BeautifulSoup(html,'lxml')

# 1 获取所有的tr标签
# trs = soup.find_all('tr')
# for tr in trs:
#     print(tr)
#     print('-'*80)

# 2 获取第二个tr标签
# tr = soup.find_all('tr')[1]
# print(tr)

# 3 获取所有class属性等于even的tr标签 class是python的关键字
# trs = soup.find_all('tr',class_='even') # class_代表的一眼是class 解决了啥问题
# # trs = soup.find_all('tr',class1='even') # class1就不是class了
# a='xxx' a_
# for tr in trs:
#     print(tr)
#     print('-' * 80)

# trs = soup.find_all('tr',attrs={'class':'even'})
# for tr in trs:
#     print(tr)
#     print('-' * 80)


# 4 将所有的a标签 id等于test class等于test 提取出来
# lst = soup.find_all('a',id='test',class_='test')
# for a in lst:
#     print(a)


# 5 获取所有a标签的href属性
# a_lst = soup.find_all('a')
# for a in a_lst:
#     href = a.get('href')
#     print(href)


# a_lst = soup.find_all('a')
# for a in a_lst:
#     href = a['href']
#     print(href)


# 6 获取职位名称
trs = soup.find_all('tr')[1:]
for tr in trs:
    tds = tr.find_all('td')
    job_name = tds[0].string
    print(job_name)

修改文档树

'''
• 修改tag的名称和属性
• 修改string  属性赋值,就相当于用当前的内容替代了原来的内容
• append() 向tag中添加内容,就好像Python的列表的 .append() 方法
• decompose() 修改删除段落,对于一些没有必要的文章段落我们可以给他删除掉
'''

# 修改tag的名称和属性
# tag_p = soup.p
# print(tag_p)
#
# tag_p.name = 'w'# 修改标签名称
# tag_p['class'] = 'content'# 修改标签属性
# print(tag_p)


# 修改string  属性赋值,就相当于用当前的内容替代了原来的内容
# tag_p = soup.p
# print(tag_p.string)
#
# tag_p.string = 'you need python'
# print(tag_p.string)

# append() 像tag中添加内容,就好像Python的列表的 .append() 方法
# tag_p = soup.p
# print(tag_p)
# tag_p.append('abc')
# print(tag_p)

# decompose() 修改删除段落,对于一些没有必要的文章段落我们可以给他删除掉
r = soup.find(class_='title')
r.decompose()
print(soup)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yerennuo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值