Python用BeautifulSoup爬取PDF链接存列表返回标签及DataFrame格式问题
问题原因
- 核心问题是变量名冲突:你在全局预先定义了存储链接的列表
link = [],但在内层遍历a标签的循环中,又把循环变量命名为link,直接覆盖了原有的列表变量。后续执行link.append(fUrl)时操作的已经不是列表,而是BeautifulSoup的Tag对象,最终打印的link其实是最后一轮循环得到的a标签对象,自然存储的是完整标签而非链接。
修复后代码
from bs4 import BeautifulSoup import requests, lxml import re from urllib.parse import urljoin from googlesearch import search import pandas as pd # 可批量添加多个查询关键词 queries = [ 'A M C College of Engineering, Bangalore', # 可继续追加其他query ] # 存储所有query的结果,每个元素对应DataFrame的一行 result_list = [] for query in queries: # 存储当前query对应的所有符合要求的pdf链接 current_pdf_links = [] for site_url in search(query, tld='co.in', start=0, stop=1): # 新增UA请求头,避免被网站反爬拦截 resp = requests.get(site_url, headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' }) soup = BeautifulSoup(resp.text, 'lxml') # 循环变量改名,避免覆盖列表变量 for a_tag in soup.select("a[href$='.pdf']"): if re.search(r'nirf', str(a_tag), flags=re.IGNORECASE): f_url = urljoin(site_url, a_tag['href']) print(f_url) current_pdf_links.append(f_url) # 当前query的所有链接用空格拼接为字符串,加入结果列表 result_list.append({ 'PDF LINKS': ' '.join(current_pdf_links) }) # 生成DataFrame,每个query对应一行 df = pd.DataFrame(result_list) print(df)
关键改动说明
- 修正变量名冲突:将内层遍历a标签的循环变量改为
a_tag,不再覆盖存储链接的列表变量 - 适配多查询存储逻辑:新增
queries列表统一管理所有搜索关键词,每个query单独开辟临时列表存储匹配的PDF链接,处理完成后将链接拼接为空格分隔的字符串存入结果列表,最终生成的DataFrame自然每个query对应一行 - 新增UA请求头:降低部分网站反爬策略拦截请求的概率,提升爬取成功率
内容的提问来源于stack exchange,提问作者Aashish Pal
相关产品推荐
相关产品推荐

