Python 爬虫(5)Beautiful Soup 4 实战

文章目录

前言:

在网络数据处理与分析的领域里,网页数据提取是极为关键的一环。Python 作为一种功能强大且广受欢迎的编程语言,为开发者们提供了众多实用的库来处理这类任务,其中 BeautifulSoup 便是一款在网页数据提取方面表现卓越的库。

一、Beautiful Soup实战

1、什么是 Beautiful Soup ?

BeautifulSoup 是一个用于从 HTML 或 XML 文件中提取数据的 Python 库。它可以将复杂的 HTML 或 XML 文档转化为树形结构,使得开发者能够轻松地遍历、搜索和修改文档内容。借助 BeautifulSoup,我们能够迅速定位到所需的数据,如特定的标签、属性或文本信息。主要特点:

  • 自动将输入文档转换为Unicode编码,输出文档转换为UTF-8编码。
  • 支持多种解析器(如lxml、html5lib等)。
  • 提供简单易用的导航、搜索和修改文档树的方法。
  • 能够处理不规范的HTML文档。

2、安装

执行下面的命令进行安装

python 复制代码
pip install beautifulsoup4

3、解析器

Beautiful Soup 支持多种解析器,每种解析器有不同的特点和适用场景。以下是主要的解析器及其差异对比。

解析器 安装方式 速度 容错性 依赖 适用场景
Python标准库 html.parser 内置,无需安装 中等 中等 简单项目,不需要额外依赖
lxml的HTML解析器 lxml pip install lxml lxml库 大多数情况下的首选
lxml的XML解析器 xml pip install lxml 严格 lxml库 解析严格的XML文档
html5lib html5lib pip install html5lib 非常好 html5lib库 解析不规范HTML,模拟浏览器行为

4、创建 Beautiful Soup 对象

创建 Beautiful Soup 对象时大多数情况下只需要关注markupfeatures参数,其他参数用于处理特殊情况。

  • markup 参数(必需)

    • 作用:指定要解析的文档内容

    • 可接受类型

      • 字符串形式的HTML/XML内容
      • 文件对象(如通过open()打开的文件)
      • URL响应内容(如requests库获取的响应)
    • 示例

      python 复制代码
      # 从字符串创建
      html_str = "<html><body><p>Hello World</p></body></html>"
      soup = BeautifulSoup(html_str, 'html.parser')
      
      # 从文件创建
      with open('index.html') as f:
          soup = BeautifulSoup(f, 'html.parser')
      
      # 从网页响应创建
      import requests
      response = requests.get('http://example.com')
      soup = BeautifulSoup(response.text, 'html.parser')
  • features 参数(推荐指定)

    • 作用:指定使用的解析器类型

    • 常用选项

      • 'html.parser':Python内置解析器(无需安装额外库)
      • 'lxml':lxml的HTML解析器(速度快,推荐使用)
      • 'xml':lxml的XML解析器
      • 'html5lib':容错性最好的HTML解析器
    • 示例

      python 复制代码
      # 使用不同解析器
      soup1 = BeautifulSoup(html_str, 'html.parser')  # 内置解析器
      soup2 = BeautifulSoup(html_str, 'lxml')        # 推荐使用的lxml解析器
      soup3 = BeautifulSoup(xml_str, 'xml')          # 解析XML文档
      soup4 = BeautifulSoup(bad_html, 'html5lib')    # 处理不规范HTML

5、选择器

通过选择器来定位节点以及获取节点对应的值,常见的选择器有下面几种

5.1、节点选择器

  • 通过标签名直接访问

    python 复制代码
    soup.title  # 获取第一个<title>标签
    soup.p  # 获取第一个<p>标签
  • find() 方法

    python 复制代码
    soup.find('div')  # 查找第一个<div>标签
    soup.find('a', class_='external')  # 查找第一个class为external的<a>标签
  • find_all() 方法

    python 复制代码
    soup.find_all('li')  # 查找所有<li>标签
    soup.find_all('span', {'class': 'highlight'})  # 查找所有class为highlight的<span>标签
相关推荐
IVEN_15 小时前
只会Python皮毛?深入理解这几点,轻松进阶全栈开发
python·全栈
Ray Liang16 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
AI攻城狮17 小时前
如何给 AI Agent 做"断舍离":OpenClaw Session 自动清理实践
python
千寻girling17 小时前
一份不可多得的 《 Python 》语言教程
人工智能·后端·python
AI攻城狮20 小时前
用 Playwright 实现博客一键发布到稀土掘金
python·自动化运维
曲幽20 小时前
FastAPI分布式系统实战:拆解分布式系统中常见问题及解决方案
redis·python·fastapi·web·httpx·lock·asyncio
孟健1 天前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
码路飞2 天前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
曲幽2 天前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers