地方议会网站PDF链接爬取无结果问题排查求助
排查PDF爬取无结果的问题
看起来你的代码逻辑有几个关键问题导致爬取无结果,我帮你逐一排查并修正:
问题分析
错误的条件判断导致循环未执行:
你写的if ['a'] in soup.select('a:contains("' + date + '")'):完全不符合逻辑,soup.select()返回的是匹配的a标签列表,你需要遍历这个列表或者判断列表不为空后获取标签,而不是判断['a']数组是否在列表里。这直接导致循环内的代码根本没运行,所以生成的文件是空的。混淆字符串变量与标签对象:
就算条件成立,date['href']也会报错——date是你定义的字符串(比如'April 2019'),不是BeautifulSoup的标签对象,只有通过select或find获取到的a标签才有href属性。链接匹配逻辑不准确:
plink['href'].find('minutes')>1这里,find()找不到子串返回-1,找到则返回起始索引。如果链接是https://xxx/minutes.pdf,起始索引是0,0>1不成立,会漏掉这类有效链接。应该改成判断子串是否存在,或者检查索引不等于-1。未处理相对路径:
页面中的PDF链接可能是相对路径(比如/documents/xxx.pdf),直接写入的话无法直接访问,需要拼接成完整的绝对URL。文件操作不够安全:
手动调用f.close()可能因代码报错导致文件未正常关闭,推荐使用with open()语句自动管理文件。
修正后的代码
import requests from bs4 import BeautifulSoup as bs # 目标日期列表 dates = ['April 2019', 'July 2019', 'December 2018'] base_url = 'https://www.gmcameetings.co.uk' target_page = f'{base_url}/meetings/committee/36/economy_business_growth_and_skills_overview_and_scrutiny' # 模拟浏览器请求头,避免被网站反爬拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } # 使用with语句安全操作文件,自动处理关闭 with open(r"E:\Internship\WORK\GMCA\Getting PDFS\gmcabusinessdatelinks.txt", "w+", encoding='utf-8') as f: # 请求目标页面,同时检查请求是否成功 r = requests.get(target_page, headers=headers) r.raise_for_status() # 如果请求失败会抛出异常,方便调试 soup = bs(r.content, 'lxml') for date in dates: # 查找包含当前日期的所有a标签 date_links = soup.select(f'a:contains("{date}")') if not date_links: print(f"⚠️ 未找到包含日期 {date} 的链接") continue # 遍历找到的日期链接(可能存在多个匹配项) for link in date_links: date_page_url = link['href'] # 处理相对路径,转为完整URL if not date_page_url.startswith('http'): date_page_url = base_url + date_page_url print(f"🔍 正在处理日期页面: {date_page_url}") # 请求日期详情页 r2 = requests.get(date_page_url, headers=headers) r2.raise_for_status() soup2 = bs(r2.text, 'lxml') # 筛选包含minutes的PDF链接 pdf_links = soup2.find_all('a', href=True) for plink in pdf_links: href = plink['href'] # 匹配包含minutes的链接,同时确保是PDF文件(可选但更精准) if 'minutes' in href.lower() and href.endswith('.pdf'): # 再次处理相对路径 if not href.startswith('http'): href = base_url + href print(f"✅ 找到Minutes链接: {href}") f.write(href + '\n') # 每行一个链接,更易读
修正说明
- 修复了日期链接的查找逻辑,正确遍历匹配到的标签
- 自动处理相对路径,将所有链接转为可直接访问的绝对URL
- 优化了PDF链接的匹配规则,同时检查是否为PDF文件,避免无效链接
- 添加
requests.raise_for_status()捕获请求失败的情况,方便调试 - 使用
with open()管理文件,确保文件安全关闭 - 添加请求头模拟浏览器,降低被反爬拦截的概率
- 增加了调试输出,方便跟踪代码执行过程
内容的提问来源于stack exchange,提问作者Rachel9866
相关产品推荐
相关产品推荐

