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

使用BeautifulSoup批量爬取URL触发AttributeError问题求助

问题分析

错误的核心是你覆盖了BeautifulSoup的别名bs:

  • 初始代码将BeautifulSoup导入为bs,但循环中用bs = get_soup(link)把该变量重赋值为单页的soup对象。
  • 第二次循环调用get_soup时,函数内的bs(...)不再是调用BeautifulSoup类,而是调用上一次循环的soup实例,返回的结果不符合预期(比如变成ResultSet),后续调用find就会触发AttributeError。

另外,readlines()读取的URL会自带换行符\n,直接请求会导致无效链接,这也是潜在的问题点。

修复后的代码
from bs4 import BeautifulSoup as bs
import requests
import constants as c

# 读取并清理URL列表,过滤空行、去除换行符
with open(c.fvtxt, 'r') as file:
    urls = [line.strip() for line in file if line.strip()]

res = []
DOMAIN = c.vatican_domain
pdf_links = []

def get_soup(url):
    try:
        response = requests.get(url)
        response.raise_for_status()  # 捕获HTTP请求错误
        return bs(response.text, 'html.parser')
    except requests.exceptions.RequestException as e:
        print(f"请求 {url} 失败: {e}")
        return None

for link in urls:
    soup = get_soup(link)
    if not soup:
        continue
    res.append(soup)
    
    # 逐层查找元素,添加判空避免报错
    header_pdf = soup.find('div', {'class': 'headerpdf'})
    if not header_pdf:
        print(f"页面 {link} 未找到headerpdf容器")
        continue
    
    pdf_a_tag = header_pdf.find('a')
    if not pdf_a_tag or not pdf_a_tag.get('href'):
        print(f"页面 {link} 未找到有效PDF链接")
        continue
    
    full_pdf_url = f"{DOMAIN}{pdf_a_tag.get('href')}"
    pdf_links.append(full_pdf_url)
    print(pdf_links)
关键修复点
  • 保留类别名:将循环中的变量名从bs改为soup,避免覆盖BeautifulSoup类的引用。
  • 清理URL:用strip()去除每行的换行符与空白字符,确保请求的URL合法。
  • 容错处理:添加请求异常捕获,以及元素查找的判空逻辑,防止单个页面出错导致整个循环终止。
  • 语义化变量:将pdf改为pdf_links,变量含义更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:50:23