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

如何用Django和requests读取网页Header?代码报错求助

问题分析与解决方案

错误原因

  1. 索引越界:final_result[1]试图访问列表的第二个元素,但第一次向final_result添加元素后,列表仅包含1个元素(索引为0),此时访问索引1必然触发IndexError。
  2. 逻辑错误:代码意图获取每个搜索结果页面的X-Frame-Options头,但循环位置和遍历对象完全错误——你错误地遍历了final_result[1](第二个搜索结果的元组内容),而非针对每个搜索结果的URL单独发起请求。

修正后的代码

def search(request):
    # ... 其他原有代码
    final_result = []
    for page_num in range(1, max_pages_to_scrap+1):
        url = f"https://www.ask.com/web?q={search}&qo=pagination&page={page_num}"
        res = requests.get(url)
        soup = bs(res.text, 'lxml')
        result_listings = soup.find_all('div', {'class': 'PartialSearchResults-item'})

        for result in result_listings:
            result_title = result.find(class_='PartialSearchResults-item-title').text
            result_url = result.find('a').get('href')
            result_desc = result.find(class_='PartialSearchResults-item-abstract').text
            
            # 单独请求当前结果URL的响应头,判断X-Frame-Options
            notAccept = False
            try:
                # 允许重定向,确保获取最终跳转后的页面头
                response = requests.get(result_url, allow_redirects=True, timeout=10)
                x_frame_option = response.headers.get('X-Frame-Options', '')
                notAccept = x_frame_option in ["DENY", "SAMEORIGIN"]
            except Exception as e:
                # 处理请求异常(如超时、无效URL、网络错误等)
                pass
            
            # 将判断结果加入最终结果列表
            final_result.append((result_title, result_url, result_desc, notAccept))
    # ... 后续返回结果的代码

关键改进点

  • 移除了错误的for header in final_result[1]:循环,改为针对每个搜索结果的result_url单独发起请求
  • 添加了异常处理,避免单个URL请求失败导致整个搜索流程崩溃
  • 使用headers.get()安全获取头信息,避免头不存在时触发KeyError
  • 加入超时设置,防止请求长时间阻塞

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:35:23