(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 获取节点的属性值
- 四、测试练习
- 总结
文章目录
- @[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
就是您最可靠的导航仪。