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

地方议会网站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')  # 每行一个链接,更易读

修正说明

  1. 修复了日期链接的查找逻辑,正确遍历匹配到的标签
  2. 自动处理相对路径,将所有链接转为可直接访问的绝对URL
  3. 优化了PDF链接的匹配规则,同时检查是否为PDF文件,避免无效链接
  4. 添加requests.raise_for_status()捕获请求失败的情况,方便调试
  5. 使用with open()管理文件,确保文件安全关闭
  6. 添加请求头模拟浏览器,降低被反爬拦截的概率
  7. 增加了调试输出,方便跟踪代码执行过程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:22:02