Python爬虫函数josaa_scrape报错:'NoneType'对象无prettify属性
解决Python爬虫中'NoneType' object has no attribute 'prettify'错误
你的josaa_scrape函数抛出该错误,核心原因是BeautifulSoup(R.text, 'lxml').find(id='GridView1')返回了None——也就是说,请求返回的页面里找不到id为GridView1的表格元素。下面是具体的问题分析和修复方案:
问题根源分析
- 参数提交逻辑错误:原代码循环遍历
params的键值对,每次POST只提交一个参数,不符合JOSAA表单的提交要求(需同时提交年份和轮次参数),导致返回的页面不是目标录取结果页面。 - 函数参数缺失:函数定义无参数,但示例用法传入了年份和轮次,实际运行时
params变量可能未正确绑定。 - 请求头不完整:缺失必要请求头可能被网站识别为爬虫,返回非目标页面。
修复后的完整代码
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
相关产品推荐
相关产品推荐

