当前位置: 首页 > news >正文

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

文章目录

    • @[TOC](文章目录)
  • 前言
    • 一、安装bs4
    • 二、bs4的基础使用
      • 2.1 创建soup对象
      • 2.2 根据标签名查找节点
      • 2.3 根据函数来查找节点
        • 1. find函数
        • 2. find_all函数
        • 3. select函数
    • 三、使用bs4获取节点信息
      • 3.1 获取节点内容
      • 3.2 获取节点的属性
      • 3.3 获取节点的属性值
    • 四、测试练习
  • 总结

前言

在当今数据驱动的时代,网络爬虫技术已成为获取和分析网络信息的重要工具。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.requeststart_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):# 获取需要解析页面的urlif 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/@altsoup = 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 就是您最可靠的导航仪。

http://www.xdnf.cn/news/510715.html

相关文章:

  • 01 CentOS根分区满了扩容
  • 2025年- H30-Lc138- 141.环形链表(快慢指针,快2慢1)---java版
  • 学习是有方法的——费曼学习法
  • 先说爱的人为什么先离开
  • 轻量级视频剪辑方案:FFmpeg图形化工具体验
  • Linux的MySQL头文件和找不到头文件问题解决
  • Java API学习笔记
  • Spring AI Alibaba集成阿里云百炼大模型应用
  • SmartETL函数式组件的设计与应用
  • 【大模型面试每日一题】Day 22:若训练中发现Loss突然剧烈波动(Spike),可能有哪些原因?如何定位和修复?
  • nginx模块使用、过滤器模块以及handler模块
  • 自适应Prompt技术:让LLM精准理解用户意图的进阶策略
  • JMeter 教程:使用 HTTP 请求的参数列表发送 POST 请求(form 表单格式)
  • 贝塞尔曲线原理
  • Android studio Could not move temporary workspace
  • 使用AI 生成PPT 最佳实践方案对比
  • ChatGPT:OpenAI Codex—一款基于云的软件工程 AI 代理,赋能 ChatGPT,革新软件开发模式
  • window自带截图快捷键
  • C++学习:六个月从基础到就业——C++20:范围(Ranges)基础
  • 【OpenCV基础 1】几何变换、形态学处理、阈值分割、区域提取和脱敏处理
  • MLLM常见概念通俗解析(一)
  • 【基于Spring Boot 的图书购买系统】深度讲解 用户注册的前后端交互,Mapper操作MySQL数据库进行用户持久化
  • 如何利用内网穿透实现Cursor对私有化部署大模型的跨网络访问实践
  • 【图像生成大模型】CogVideoX-5b:开启文本到视频生成的新纪元
  • lvs-dr部署
  • c++学习之--- list
  • C语言链表的操作
  • 数字人技术的核心:AI与动作捕捉的双引擎驱动(210)
  • defer关键字:延迟调用机制-《Go语言实战指南》
  • 8.1UDP点对点聊天小项目