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

Python爬虫函数josaa_scrape报错:'NoneType'对象无prettify属性

解决Python爬虫中'NoneType' object has no attribute 'prettify'错误

你的josaa_scrape函数抛出该错误,核心原因是BeautifulSoup(R.text, 'lxml').find(id='GridView1')返回了None——也就是说,请求返回的页面里找不到id为GridView1的表格元素。下面是具体的问题分析和修复方案:

问题根源分析

  1. 参数提交逻辑错误:原代码循环遍历params的键值对,每次POST只提交一个参数,不符合JOSAA表单的提交要求(需同时提交年份和轮次参数),导致返回的页面不是目标录取结果页面。
  2. 函数参数缺失:函数定义无参数,但示例用法传入了年份和轮次,实际运行时params变量可能未正确绑定。
  3. 请求头不完整:缺失必要请求头可能被网站识别为爬虫,返回非目标页面。

修复后的完整代码

import requests
from bs4 import BeautifulSoup
import pandas as pd

def josaa_scrape(year, round_num):
    """
    Sample usage: df = josaa_scrape("2018", "1")
    df.info()
    """
    url = "https://josaa.admissions.nic.in/applicant/seatallotmentresult/currentorcr.aspx"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
        "Referer": url,
        "Accept-Language": "en-US,en;q=0.9"
    }
    params = {"Year": year, "Round": round_num}

    with requests.Session() as s:
        # 先GET页面获取表单隐藏字段
        R = s.get(url, headers=headers)
        if R.status_code != 200:
            raise ConnectionError(f"GET请求失败,状态码:{R.status_code}")
        
        soup = BeautifulSoup(R.content, 'lxml')
        # 提取ASP.NET表单必需的隐藏字段
        hidden_fields = {tag['name']: tag['value'] for tag in soup.select('input[name^=__]')}
        # 合并隐藏字段和业务参数
        data = {**hidden_fields, **params}
        
        # 一次性POST所有参数
        R = s.post(url, data=data)
        if R.status_code != 200:
            raise ConnectionError(f"POST请求失败,状态码:{R.status_code}")
        
        # 解析目标表格
        soup = BeautifulSoup(R.text, 'lxml')
        table = soup.find(id='GridView1')
        if not table:
            # 打印页面片段用于排查问题
            print("未找到目标表格,返回页面内容片段:")
            print(R.text[:1000])
            raise ValueError("无法定位到id为GridView1的表格元素")
        
        df = pd.read_html(table.prettify())[0]
        df.dropna(inplace=True, how="all")
        return df

额外排查建议

  • 若仍报错,查看打印的页面内容:如果是验证码页面、登录提示,说明网站有反爬机制,需处理验证码或会话验证;如果是404/500错误,检查目标URL是否已变更。
  • 用浏览器开发者工具重新确认表格id:打开JOSAA录取结果页面,F12查看元素,确保表格id确实是GridView1。
  • 更新User-Agent为当前浏览器的真实UA,避免被识别为爬虫。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:10:35