爬虫-bs4

我是张晨,一转眼,我在新课已经学习了很长一段时间。回顾这几个月的时间,我收获了很多知识。这里是我的一点学习笔记。
一、BeautifulSoup

Beautiful Soup 简称 BS4(其中 4 表示版本号)是一个 Python 第三方库,它可以从 HTML 或 XML 文档中快速地提取指定的数据。Beautiful Soup 语法简单,使用方便,并且容易理解,因此您可以快速地学习并掌握它。本节我们讲解 BS4 的基本语法。

二、BS4下载安装

由于 Bautiful Soup 是第三方库,因此需要单独下载,下载方式非常简单,执行以下命令即可安装:

pip install bs4

三、BS4解析对象

创建 BS4 解析对象是万事开头的第一步,这非常地简单,语法格式如下所示

#导入解析包
from bs4 import BeautifulSoup
#创建beautifulsoup解析对象
soup = BeautifulSoup(html_doc, 'html.parser') # html_doc 表示要解析的文档,而 html.parser 表示解析文档时所用的解析器,此处的解析器也可以是 'lxml' 或者 'html5lib'

#prettify()用于格式化输出html/xml文档
print(soup.prettify())

Beautiful Soup 将 HTML 文档转换成一个树形结构,该结构有利于快速地遍历和搜索 HTML 文档。下面使用树状结构来描述一段 HTML 文档:

<html>
    <head>
        <title>中文</title>
    </head>
    <body>
        <h1>net</h1>
        <p>
            <b>编程</b>
        </p>
    </body>
</html>

文档树中的每个节点都是 Python 对象,这些对象大致分为四类:Tag , NavigableString , BeautifulSoup , Comment 。其中使用最多的是 TagNavigableString

  • Tag:标签类,HTML 文档中所有的标签都可以看做 Tag 对象。
  • NavigableString:字符串类,指的是标签中的文本内容,使用 text、string、strings 来获取文本内容。
  • BeautifulSoup:表示一个 HTML 文档的全部内容,您可以把它当作一个人特殊的 Tag 对象。
  • Comment:表示 HTML 文档中的注释内容以及特殊字符串,它是一个特殊的 NavigableString

1.Tag节点

标签(Tag)是组成 HTML 文档的基本元素。在 BS4 中,通过标签名和标签属性可以提取出想要的内容。看一组简单的示例

from bs4 import BeautifulSoup
soup = BeautifulSoup('<p class="url"><b>net</b></p>', 'html.parser')
#获取第一个p标签的html代码
print(soup.p)
#获取b标签
print(soup.p.b)
#获取p标签内容,使用NavigableString类中的string、text、get_text()
print(soup.p.text)
#返回一个字典,里面是多有属性和值
print(soup.p.attrs)
#查看返回的数据类型
print(type(soup.p))
#根据属性,获取标签的属性值,返回值为列表 不存在就报错
print(soup.p['class'])
# 获取具体属性 获取最近的第一个属性 不存在就返回None
print(soup.title.get('class'))
#给class属性赋值,此时属性值由列表转换为字符串
soup.p['class']=['abc','data']
print(soup.p)

四、遍历节点

Tag 对象提供了许多遍历 tag 节点的属性,比如 contents、children 用来遍历子节点;parent 与 parents 用来遍历父节点;示例如下:

#coding:utf8
from bs4 import BeautifulSoup

html_doc = """
<html>
    <head>
        <title>title</title>
    </head>
    <body>
        <p class="title"><b>net</b></p>
        <p class="website">网站</p>
        <a href="http:xxxx" id="link1">xxxx</a>
        <a href="http:xxx" id="link2">xxxx</a> 
    </body>
</html>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
body_tag=soup.body
print(body_tag)
#以列表的形式输出,所有子节点
print(body_tag.contents)

运行结果:

image-20230518160320425

五、find_all()与find()

find_all() 与 find() 是解析 HTML 文档的常用方法,它们可以在 HTML 文档中按照一定的条件(相当于过滤器)查找所需内容。find() 与 find_all() 的语法格式相似,希望大家在学习的时候,可以举一反三。

1.find_all()

find_all() 方法用来搜索当前 tag 的所有子节点,并判断这些节点是否符合过滤条件

find_all(标签名,属性) # 获取满足条件的所有数据,将满足条件的对象存放在一个列表中

示例:

#coding:utf8
from bs4 import BeautifulSoup

html_doc = """
<html>
    <head>
        <title>title</title>
    </head>
    <body>
        <p class="title"><b>net</b></p>
        <p class="website">网站</p>
        <a href="http:xxxx" id="link1">xxxx</a>
        <a href="http:xxx" id="link2">xxxx</a> 
    </body>
</html>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
print(soup.find_all('meta', content="webkit"))
print(soup.find_all("p",class_="website"))
print(soup.find_all(id="link4"))

运行结果:

image-20230518161204058

2.find()

find(标签名,属性) # 获取满足条件的一个数据 并且返回这个对象

示例:

#coding:utf8
from bs4 import BeautifulSoup

html_doc = """
<html>
    <head>
        <title>title</title>
    </head>
    <body>
        <p class="title"><b>net</b></p>
        <p class="website">网站</p>
        <a href="http:xxxx" id="link1">xxxx</a>
        <a href="http:xxx" id="link2">xxxx</a> 
    </body>
</html>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
print(soup.find('p',class_="website"))
print(soup.find('a', id="link2"))

运行结果:

image-20230518161704082

豆果实战示例:

import requests
from bs4 import BeautifulSoup
url = 'https://www.douguo.com/jingxuan/0'
cookies = {
    'https_waf_cookie': 'b8d34e65-19d4-43c9cf22f7323710ddc150dadffd417228da',
    'Hm_lvt_f4fa5d56f272ae0a0777feec2184a97f': '1679401504',
    'Hm_lpvt_f4fa5d56f272ae0a0777feec2184a97f': '1679401504',
    'XSRF-TOKEN': 'eyJpdiI6IlU1NVhleWRrelwvMkxTdURySUNwaHZBPT0iLCJ2YWx1ZSI6ImxQN2U0K1pub2JMK284aWlVZGhyd3A2Q29nWG5JaFRnWHdqRWVqSVdmckZBYXJcL3pIbldEd2JSN1NFcld3ZW1ZIiwibWFjIjoiZGRlZmYxOTVlMGE0OWQyN2U3NTZmOWVmMDQ3OWU3YzU1NDQzYjk1ZmJjNjQyZjYxMWJhNTMxODk5YzkyNGUzOCJ9',
    'laravel_session': 'Mh5KTgGPCVYgV95ET5WizdA5tfw7XPThjxXg8ARa',
    '__gads': 'ID=4ad63e996f9fd1ec-220feee98cdc003a:T=1679401504:RT=1679401504:S=ALNI_MZa1i0ojQSU1uP2tlU3sWvsxJ0dTw',
    '__gpi': 'UID=00000bdcad3fc8f4:T=1679401504:RT=1679401504:S=ALNI_MYak7XIe7yPiBPdcFK5KXtQ4l_QZw',
}
headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Pragma': 'no-cache',
    'Sec-Fetch-Dest': 'document',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-Site': 'none',
    'Sec-Fetch-User': '?1',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
    'sec-ch-ua': '\\',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '\\',
}
params = {
}
response = requests.get(url, headers=headers, params=params, cookies=cookies)
html = BeautifulSoup(response.text, 'lxml')
title = html.find_all('a', class_='cookname text-lips')
title_list = []
for i in title:
    title_list.append(i.text)
print(title_list)
print(len(title_list))
author = html.find_all('a', class_="author text-lips")
author_list = [i.img['alt'] for i in author]
print(author_list)

运行结果:
image-20230518163641971
暂时先分享这么多吧,希望大家在学习过程当中都能有所收获,感谢新课,如果想获取更多资料或者联系加群,可以关注我们新课的微信公众号,后台自动回复获取代码笔记资料。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值