Python爬虫实战:异常处理与BeautifulSoup标签过滤详解

凌晨两点半
凌晨两点半
发布时间:2026-10-14| 5人浏览过
原创

本文详细解析Python爬虫开发中的关键技巧,涵盖网络请求阶段的HTTPError与URLError异常处理,以及BeautifulSoup解析HTML时的NoneType错误防御。深入讲解find与find_all方法的区别、参数配置(如limit、recursive)及属性过滤技巧,通过豆瓣电影数据抓取实例,展示如何高效获取特定标签文本并处理常见编码问题,帮助开发者提升爬虫稳定性与数据提取精度。

Python爬虫异常捕获机制

在编写爬虫程序时,引入完善的异常捕获机制至关重要。这不仅能防止程序因意外错误而崩溃,还能帮助开发者快速定位问题所在,明确是网络请求失败还是页面解析出错,从而更有针对性地解决问题。


import ssl
import urllib.request
from bs4 import BeautifulSoup
from urllib.error import HTTPError, URLError
 
 
def get_data(url):
    headers = {"user-agent":
                   "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"
               }
    ssl._create_default_https_context = ssl._create_unverified_context
 
    """
    urlopen处增加两个异常捕获:
            1、如果页面出现错误或者服务器不存在时,会抛HTTP错误代码
            2、如果url写错了或者是链接打不开时,会抛URLError错误
    """
    try:
        url_obj = urllib.request.Request(url, headers=headers)
        response = urllib.request.urlopen(url_obj)
        html = response.read().decode('utf8')
    except (HTTPError, URLError)as e:
        raise e
 
    """
    BeautifulSoup处增加异常捕获是因为BeautifulSoup对象中有时候标签实际不存在时,会返回None值;
    因为不知道,所以调用了就会导致抛出AttributeError: 'NoneType' object has no xxxxxxx。
    """
    try:
        bs = BeautifulSoup(html, "html.parser")
        results = bs.body 
    except AttributeError as e:
        return None
 
    return results
 
 
if __name__ == '__main__':
    print(get_data("https://movie.douban.com/chart"))

对HTML内容进行解析后,能够更清晰地展示数据结构,便于后续的数据提取与展示。通过解析,我们可以将非结构化的网页代码转化为易于操作的对象模型。

  • get_text():用于从BeautifulSoup标签对象中提取纯文本内容,去除HTML标签本身,仅保留文字信息。

# 此处代码同上面打开url代码一致,故此处省略......
 
html = response.read().decode('utf8')
bs = BeautifulSoup(html, "html.parser")
data = bs.find('span', {'class': 'pl'})
print(f'电影评价数:{data}')
print(f'电影评价数:{data.get_text()}')

运行上述代码后,控制台输出结果如下所示:


电影评价数:<span class="pl">(38054人评价)</span>
电影评价数:(38054人评价)
  • find() 方法用于在HTML文档中过滤标签,查找并返回第一个匹配指定条件的单个标签对象。

BeautifulSoup标签过滤详解

实际上,find方法的底层实现调用了find_all方法,并将limit参数设置为1,从而只获取匹配结果中的第一个标签。

1.name:表示当前标签元素的名称,例如div、span等,可直接理解为标签类型。

2.attrs:以字典格式存储标签的所有属性及其对应的值,例如 {"class": "indent"} 表示该标签具有class属性且值为indent。

3.recursive:布尔型递归参数。当设为True时,BeautifulSoup会递归查询子标签;若为False,则只搜索直接子节点。

4.text:用于匹配标签内的文本内容。注意区分标签本身的文本内容与标签属性,text参数专门用于筛选包含特定字符串的标签节点。

  • find_all() 方法同样用于过滤HTML标签,但其功能是查找并返回所有匹配指定条件的标签列表。

其基本用法与find方法一致,主要区别在于find_all支持额外的limit参数,用于限制返回结果的数量,从而实现更灵活的数据筛选。

find_all方法使用注意事项

在实际使用中,必须注意以下关键细节:


#   下面两种写法,实际是一样的功能,都是查询id为text的属性值
bs.find_all(id="text")
bs.find_all(' ', {"id": "text"})

#   如果是class的就不能class="x x x"了,因为class是python中类的关键字
bs.find_all(class_="text")
bs.find_all(' ', {"class": "text"})

本文介绍了Python爬虫中异常捕获及标签过滤的核心技术。更多相关Python异常处理及标签过滤的高级技巧,欢迎查阅本站往期文章或继续浏览后续内容。感谢大家的支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。