You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用BeautifulSoup检测网页body?批量处理500+网页遇问题求助

批量检测网页是否存在body元素的解决方案

核心问题排查

  1. 脚本中途崩溃:未捕获请求阶段的异常(超时、连接失败、HTTP错误等),单个URL出错就导致整个脚本停止。
  2. body检测逻辑错误:soup.select('body')返回的是列表对象,和空字符串''比较永远不成立,无法正确判断body是否存在。
  3. 超时处理不完善:仅设置单一timeout值不够灵活,且没有应对临时网络波动的重试机制。

修复后的完整代码

import requests
import bs4
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

# 配置会话与重试机制,提升批量请求稳定性
session = requests.Session()
retry_strategy = Retry(
    total=3,  # 最多重试3次
    backoff_factor=1,  # 重试间隔依次为1s、2s、4s
    status_forcelist=[500, 502, 503, 504]  # 遇到服务器错误时自动重试
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount('http://', adapter)
session.mount('https://', adapter)

def check_body_exists(url):
    try:
        # 拆分连接超时(10s)和读取超时(40s),适配不同场景
        response = session.get(url, timeout=(10, 40))
        response.raise_for_status()  # 主动抛出HTTP状态码错误
        
        soup = bs4.BeautifulSoup(response.text, 'html.parser')
        # 直接判断列表是否非空,即可确认body元素存在
        if soup.select('body'):
            print(f"{url} - 检测到body元素")
            return True
        else:
            print(f"{url} - 未检测到body元素")
            return False
    except requests.exceptions.RequestException as e:
        # 捕获所有请求异常,保证脚本继续运行
        print(f"{url} - 请求失败: {str(e)}")
        return False

# 替换为你的URL列表
url_list = ["https://example.com", "https://test.com"]
for url in url_list:
    check_body_exists(url)

关键优化说明

  • 异常兜底:通过try-except捕获所有请求相关异常,单个URL出错不会中断整个批量任务。
  • 正确的body检测:利用列表的布尔特性,非空列表即为True,直接判断soup.select('body')即可,无需和空字符串比较。
  • 灵活超时与重试:拆分超时参数,同时配置重试策略,应对临时网络波动或服务器错误,提升检测成功率。
  • 会话复用:使用Session对象复用TCP连接,减少重复握手,提升批量请求的效率。

内容的提问来源于stack exchange,提问作者stack overflow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:10:33