Python网络爬虫(十三)- 数据解析模块 BeautifulSoup

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()
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容