当前位置: 首页 > 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 就是您最可靠的导航仪。

相关文章:

  • DOM知识点
  • LangGraph Platform 快速入门
  • 论文阅读(四):Agglomerative Transformer for Human-Object Interaction Detection
  • [Java实战]Spring Boot整合RabbitMQ:实现异步通信与消息确认机制(二十七)
  • day29 python深入探索类装饰器
  • 给大模型“贴膏药”:LoRA微调原理说明书
  • Java面试实战:从Spring Boot到分布式缓存的深度探索
  • 多指标组合策略思路
  • Vue3学习(组合式API——provide和inject)(跨多层级组件通信/跨多层级共享数据)
  • java加强 -多线程 -创建与常用方法
  • 如何完美安装GPU版本的torch、torchvision----解决torch安装慢 无法安装 需要翻墙安装 安装的是GPU版本但无法使用的GPU的错误
  • ​Docker 网络
  • vue3_flask实现mysql数据库对比功能
  • 一款适配国内的视频软件,畅享大屏与局域网播放
  • sparkSQL读入csv文件写入mysql(2)
  • STM32SPI实战-Flash模板
  • html文件cdn一键下载并替换
  • 计算机图形学中MVP变换的理论推导
  • R for Data Science(3)
  • windows环境下c语言链接sql数据库
  • 上海蝉联全国中小企业发展环境评估综合排名第一
  • 中国古代文学研究专家、南开大学教授李剑国逝世
  • 复旦一校友捐赠1亿元,却不留名
  • 以色列在加沙发起新一轮强攻,同步与哈马斯展开“无条件谈判”
  • 国宝归来!子弹库帛书二、三卷抵达北京
  • 蔡建忠已任昆山市副市长、市公安局局长