16 处理异常

在上一篇文章中,我们详细探讨了如何使用 BeautifulSoup 库提取网页数据。作为网页抓取的重要环节,异常处理确保了我们在处理数据时能够优雅地应对潜在问题。在这一节中,我们将学习如何在使用 BeautifulSoup 抓取数据时处理各种异常,以提高代码的鲁棒性。

异常处理的重要性

网页抓取过程中,可能会遇到网络异常、页面结构变化、标签缺失等问题。如果不对这些问题进行处理,我们的程序可能会崩溃,导致数据抓取失败。因此,学习如何捕获和处理异常是必不可少的。

常见的异常类型

在抓取网页数据时,以下是几种常见的异常类型:

  • requests.exceptions.RequestException: 捕获所有请求相关的异常。
  • AttributeError: 当尝试访问一个不存在的属性时将引发此异常。
  • IndexError: 当访问列表的超出范围的索引时。
  • KeyError: 当访问字典中不存在的键时。

使用 try...except 进行异常处理

在Python中,我们可以使用 try...except 语句来捕获异常并进行处理。以下是一个基本的例子,展示了如何在抓取网页时处理异常:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import requests
from bs4 import BeautifulSoup

url = 'https://example.com'

try:
# 发起请求
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功

# 解析网页
soup = BeautifulSoup(response.content, 'html.parser')

# 提取数据(假设我们在抓取一个标题)
title = soup.find('title').get_text() # 使用get_text()可能会引发AttributeError
print(f'网页标题是: {title}')

except requests.exceptions.RequestException as e:
print(f'请求发生错误: {e}')
except AttributeError as e:
print(f'数据提取时发生错误: {e}')
except Exception as e:
print(f'发生了一个意外错误: {e}')

代码说明

  1. 导入所需库:我们需要 requestsBeautifulSoup
  2. 发起请求:使用 requests.get() 获取网页内容,并通过 raise_for_status() 检查请求是否成功。
  3. 解析网页:创建 BeautifulSoup 对象以解析网页内容。
  4. 提取数据:尝试提取标题信息,并使用 get_text() 方法获取其文本。
  5. 异常处理
    • 捕获请求异常并显示相应的错误消息。
    • 捕获属性异常来处理可能的解析错误。
    • 捕获其它所有异常,确保程序不会因为未处理的异常而崩溃。

实际案例

假如我们需要从一个动态生成内容的网页抓取多个元素,我们可能会在请求响应和数据解析中都遇到问题。下面是一个案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import requests
from bs4 import BeautifulSoup

url = 'https://example.com/dynamic-page'

try:
response = requests.get(url)
response.raise_for_status()

soup = BeautifulSoup(response.content, 'html.parser')

# 假设我们希望提取一组某个类名的商品名称
product_names = soup.find_all(class_='product-name')

for i, product in enumerate(product_names):
try:
name = product.get_text().strip()
print(f'第 {i + 1} 个商品名称: {name}')
except AttributeError as e:
print(f'提取第 {i + 1} 个商品名称时发生错误: {e}')

except requests.exceptions.RequestException as e:
print(f'请求发生错误: {e}')
except Exception as e:
print(f'发生了一个意外错误: {e}')

代码说明

  • 该例子展示了如何处理一系列元素的提取。
  • 对每个商品名称提取都包裹在了一个单独的 try...except 语句中,这样即便某个商品名称提取失败,也不会影响其它商品名称的提取过程。

总结

在这一节中,我们深入研究了如何在使用 BeautifulSoup 抓取数据时处理异常。通过合理的异常捕获和处理,我们可以使我们的程序更加强大和灵活。接下来,我们将进入 Selenium 库的使用,它可以处理更复杂的网页抓取需求。

请紧接着阅读下一节:Selenium库的使用之6.1 Selenium库介绍。

作者

IT教程网(郭震)

发布于

2024-08-11

更新于

2024-08-11

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论