使用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
相关产品推荐
相关产品推荐

