1、BS4简介
BeautifulSoup(简称 BS4) 是一个用于解析 HTML 和 XML 文档的 Python 第三方库。
它能够从网页或其他 HTML/XML 格式的文本中提取数据,并将其转换为结构化的对象,方便开发者快速定位、提取和操作所需信息。
它的核心功能是通过解析器将无序的标记语言转换为树形结构(DOM 树),使数据提取过程更加直观和高效。
2、特点与优势
简单易用:提供简洁的 API,即使是新手也能快速上手,无需深入掌握复杂的 HTML 解析原理。
兼容性强:支持多种解析器(如 Python 内置的html.parser、lxml等),可根据需求选择效率更高的解析方式。
灵活处理:能处理不规范的 HTML 代码(如标签缺失闭合、格式混乱等),适应性强。
高效提取:通过标签名、类名、ID、属性等多种方式定位元素,支持 CSS 选择器和正则表达式,提取数据更精准。
3、BS4安装
Linux系统安装
$ sudo apt-get install python-bs4
Mac系统安装
$ pip install bs4
Windows系统安装
$ pip install bs4
4、BS4使用
BeautifulSoup 的核心功能及常用操作
1. 解析文档
基本使用
html = '''<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>音乐</h1>
<p class="content">张韶涵</p>
<ul>
<li>
<a href="/first">1 阿刁</a>
</li>
<li>
<a href="/second">2 墨色回响</a>
</li>
<li>
<a href="/third">3 无名之辈</a>
</li>
</ul>
</body>
</html>'''
soup = BeautifulSoup(html, 'html.parser') # 使用html.parser解析器
1 从字符串解析
常见解析器
| 解析器 | 优势 | 劣势 | 安装方式 |
|---|---|---|---|
| html.parser | Python 内置,无需额外安装 | 功能较简单,效率一般 | 无需安装 |
| lxml | 效率高,支持 XML 解析 | 需要额外安装 | pip install lxml |
| html5lib | 解析规则更接近浏览器 | 效率较低 | pip install html5lib |
2. 元素定位
常见使用
通过标签名直接访问:soup.h1(获取第一个<h1>标签)
通过属性查找:soup.find(‘p’, class_=‘content’)(查找 class 为 content 的 p 标签)
通过 CSS 选择器:soup.select(‘p.content’)(等价于上述操作,支持复杂选择器)
示例
# 2 元素定位
# 通过 标签 获取元素
h1_tag = soup.h1
print(h1_tag, type(h1_tag)) # <h1>音乐</h1> <class 'bs4.element.Tag'>
# 通过查找对象获取元素:查找 p 元素且class属性值为content
p_tag = soup.find('p', class_='content')
print(p_tag, type(p_tag)) # <p class="content">张韶涵</p> <class 'bs4.element.Tag'>
# 通过 css 选择器获取元素:选择器为 p 元素且class属性值为content
p_tag = soup.select('p.content')
print(p_tag, type(p_tag)) # [<p class="content">张韶涵</p>] <class 'bs4.element.ResultSet'>
3. 提取文本与属性
常见使用
提取文本:tag.text 或 tag.get_text()
提取属性:tag[‘attr_name’](如a_tag[‘href’]获取链接)
示例
# 3 提取文本与属性
# 获取p标签中的文本
print(p_tag[0].text)
print(p_tag[0].get_text())
# 获取a标签中的href属性值
a_tag = soup.find('a')
print(a_tag, type(a_tag)) # <a href="/first">1 阿刁</a> <class 'bs4.element.Tag'>
print(a_tag['href']) # /first
4. 遍历与搜索
常见使用
遍历子元素:soup.body.children
递归搜索:soup.find_all(‘div’)(查找所有 div 标签)
示例
# 4 遍历与搜索
# 获取所有li标签
uls_tag = soup.ul.children
print(uls_tag) # <list_iterator object at 0x000002296D847370>
for li in uls_tag:
print(li)
'''
<li>
<a href="/first">1 阿刁</a>
</li>
<li>
<a href="/second">2 墨色回响</a>
</li>
<li>
<a href="/third">3 无名之辈</a>
</li>
'''
# 获取所有a标签
a_tags = soup.find_all('a')
for a in a_tags:
print(a)
'''
<a href="/first">1 阿刁</a>
<a href="/second">2 墨色回响</a>
<a href="/third">3 无名之辈</a>
'''
5、案例实现
import requests
from bs4 import BeautifulSoup
class HotClasses:
def __init__(self):
self.headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36'}
# self.data = {
# 'page': 1,
# 'cdictid': 0,
# 'schoolid': 0,
# 'order': 'hot'}
def get_html(self, url):
try:
response = requests.post(url, headers=self.headers)
response.encoding = 'utf-8'
return response.text
except:
return None
def parse_html(self, html):
soup = BeautifulSoup(html, 'html.parser')
divs = soup.find_all('div', class_='text_4 clearfix')[1]
dls = divs.find_all('dl')
for dl in dls:
newsCode = dl.find('em').get_text()
newsTitle = dl.find('a')['title']
newsContent = dl.find('dd').get_text()
print(newsCode, newsTitle, newsContent)
print('-' * 30)
def main(self):
url = 'https://stock.cngold.org/zt/gupiaojiage.html'
htmls = self.get_html(url)
# print(htmls, type(htmls))
self.parse_html(htmls)
if __name__ == '__main__':
hot = HotClasses()
hot.main()




















暂无评论内容