(5)python爬虫--BeautifulSoup(bs4)

发布于:2025-05-19 ⋅ 阅读:(24) ⋅ 点赞:(0)

前言

在当今数据驱动的时代,网络爬虫技术已成为获取和分析网络信息的重要工具。Python 作为最受欢迎的编程语言之一,凭借其丰富的生态系统和简洁的语法,为开发者提供了强大的网页抓取能力。而在众多网页解析库中,BeautifulSoup 以其优雅的设计和易用性脱颖而出,成为 Python 爬虫领域的"瑞士军刀"。
BeautifulSoup 不仅能够高效地处理不规范的 HTML 文档,还提供了直观的 DOM 树遍历方法,让开发者能够像使用 jQuery 一样轻松提取所需数据。无论是简单的个人项目,还是复杂的企业级数据采集系统,BeautifulSoup 都能胜任。本文将带您深入了解 BeautifulSoup 的核心功能,从基础安装到实战技巧,通过具体示例展示如何利用这个强大的库来解析网页、提取数据并处理各种常见挑战。无论您是刚入门网络爬虫的新手,还是希望提升解析效率的经验丰富的开发者,都能从本文中获得有价值的见解。


一、安装bs4

这里不再提供安装方式,可根据安装lxml的方式来安装bs4即可。

二、bs4的基础使用

2.1 创建soup对象

# 1. 导包
from bs4 import BeautifulSoup

# 解析本地文件
# 第二个参数必须是lxml
# 默认打开文件的方式是gbk,所以打开文件的时候需要指定编码
soup = BeautifulSoup(open('test.html',encoding='utf-8'),'lxml')

2.2 根据标签名查找节点

获取的是第一个符合的标签

# 1.根据标签名查找节点
# 找到的是第一个符合条件的数据
print(soup.a)
# 获取标签的属性和属性值
print(soup.a.attrs)

2.3 根据函数来查找节点

1. find函数
# (1)find
# 返回的是第一个符合条件的数据
print(soup.find("a"))
# 根据属性值查找对应的标签
print(soup.find("a",id="2"))
# 当根据class查找的时候,需要注意不能单纯使用class,需要带上一个下划线
print(soup.find("a",class_="a1"))
2. find_all函数
# (2)find_all 返回的是一个列表
# 返回所有的a标签
print(soup.find_all("a"))
# 获取去多个不同标签的数据,需要在find_all中参数添加为列表的数据才可以
print(soup.find_all(["a","span"]))
# 使用limit可以限定获取前多少个数据
print(soup.find_all("li"))
print(soup.find_all("li",limit=2))
3. select函数
# (3)select 推荐
# select方法返回一个列表,并且返回多个数据
print(soup.select("a"))
# 可以通过类选择器,找到指定的标签
print(soup.select(".a1"))
# 通过id选择器,找到指定的标签
print(soup.select("#a1"))
# 属性选择器---通过属性来寻找对应的标签
# 查找所有li中包含id属性的标签
print(soup.select("li[id]"))
# 查找到li标签中id为l2的标签
print(soup.select('li[id="l2"]'))
# 找到a标签和li标签对应的所有元素
print(soup.select("a,li"))

三、使用bs4获取节点信息

3.1 获取节点内容

# 获取节点内容
obj = soup.select("#d1")[0]
# print(obj)
print(obj.string)
print(obj.get_text())
# 如果标签对象中,之存在内容,不存在其他的子标签,那么string和get_text()都可以使用
# 如果存在其他的标签,那就只能使用get_text()获取内容
# 因而更推荐get_text()

3.2 获取节点的属性

# 节点的属性
obj = soup.select("#p1")[0]
# name是获取标签的名字
print(obj.name)
# 将属性值通过一个字典返回
print(obj.attrs)

3.3 获取节点的属性值

# 获取节点的属性值
obj = soup.select("#p1")[0]
# 方式一
print(obj.attrs.get('class'))
# 方式二
print(obj.get('class'))
# 方式三
print(obj['class'])

四、测试练习

# bs4解析数据
# 确保是上网环境
from bs4 import BeautifulSoup
from lxml import etree
import requests
import urllib.request

start_page = int(input('请输入起始页码:'))
end_page = int(input('请输入结束页码:'))
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
for page in range(start_page, end_page+1):
    # 获取需要解析页面的url
    if page == 1:
        url = 'https://sc.chinaz.com/tag_tupian/qinglvtouxiang.html'
    else:
        url = 'https://sc.chinaz.com/tag_tupian/qinglvtouxiang_' + str(page) + '.html'
    # 获取页面源码(requests)
    response = requests.get(url,headers=headers)
    content = response.content.decode()
    # print(content)

    # 解析图片路径 以及对应的alt值 HTML解析获取来的响应数据
    # 可以先通过插件获取到的xpath路径 再更改为对应的bs4语法
    # 响应数据直接写入到第一个参数即可
    # //div[@id="container"]//a/img/@src
    # //div[@id="container"]//a/img/@alt
    soup = BeautifulSoup(content, 'lxml')
    all_list = soup.select('img[src2]')
    for each in all_list:
        src = "https:"+each['src2']
        alt = each['alt']
        # print(src, alt)
        urllib.request.urlretrieve(src, "./img/"+alt+".jpg")

总结

通过本文的探索,我们见证了 BeautifulSoup如何将复杂的 HTML 解析过程转化为简单直观的 Python 操作。从基本的标签搜索到复杂的树形结构遍历,BeautifulSoup 提供了一套完整的工具集,让我们能够轻松应对各种网页解析需求。值得注意的是,虽然 BeautifulSoup 功能强大,但在实际项目中往往需要与其他库(如 requests、lxml 或 Scrapy)配合使用,才能构建完整的网络爬虫解决方案。

网络数据的结构和形态在不断变化,但 BeautifulSoup 的灵活性和稳定性使其始终保持着在网页抓取领域的重要地位。正如我们所见,掌握 BeautifulSoup 不仅能提高数据采集效率,还能帮助我们更好地理解网页结构和信息组织方式。希望本文能成为您 BeautifulSoup 学习之旅的有益指南,期待您运用这些知识去探索更广阔的数据世界,创造更有价值的应用。记住,在网络数据的海洋中,BeautifulSoup 就是您最可靠的导航仪。


网站公告

今日签到

点亮在社区的每一天
去签到