diff --git a/laod_ai_parse_html.py b/laod_ai_parse_html.py new file mode 100644 index 0000000..7635177 --- /dev/null +++ b/laod_ai_parse_html.py @@ -0,0 +1,148 @@ +# 导入所需的标准库和第三方库 +import json +import requests +import os + +# ===================== 配置项 ===================== +# API密钥(请在此处填写你的实际密钥) +API_KEY = "" + +# API请求的基础URL +API_BASE_URL = "https://api.longcat.chat/openai/v1/chat/completions" + + +# ===================== 核心函数 ===================== +def parse_ai_response(response: dict) -> list | None: + """ + 解析AI返回的响应数据,提取其中的JSON格式信息 + + Args: + response (dict): AI接口返回的原始响应字典 + + Returns: + list | None: 解析成功返回信息列表,失败返回None + """ + try: + # 1. 提取AI回复的文本内容(核心路径:choices -> 第一个元素 -> message -> content) + content = response['choices'][0]['message']['content'] + + # 2. 定位并提取包裹在```json和```之间的JSON字符串 + # 找到起始标记位置并跳过标记本身 + start_idx = content.find('```json') + len('```json') + # 找到结束标记位置 + end_idx = content.rfind('```') + # 提取并清理JSON字符串(去除首尾空白字符) + json_str = content[start_idx:end_idx].strip() + + # 3. 将JSON字符串转换为Python列表(信息) + train_data = json.loads(json_str) + + return train_data + + # 捕获可能的异常:KeyError(键不存在)、IndexError(索引越界)、JSONDecodeError(JSON解析失败) + except (KeyError, IndexError, json.JSONDecodeError) as e: + print(f"❌ 解析AI响应数据时出错: {e}") + return None + +def clean_html(raw_html): + """ + 清洗 HTML,移除无关标签以节省 Token + """ + soup = BeautifulSoup(raw_html, 'html.parser') + + # 移除 script, style, svg 等无关标签 + for script in soup(["script", "style", "svg", "head", "iframe"]): + script.decompose() + + # 获取纯文本或保留部分结构的 HTML (视模型能力而定,通常保留 tag 有助于定位) + # 这里我们保留精简后的 HTML 结构 + return str(soup.body)[:10000] # 截取前 10000 字符防止超长 + +def ask_ai_train_parse(role_prompt: str, text_html: str, save_path: str) -> None: + """ + 调用AI接口解析网页中的信息,并将结果保存为JSON文件 + + Args: + role_prompt (str): 系统角色提示词,定义AI的行为 + text_html (str): 包含信息的网页HTML文本 + save_path (str): 解析结果的保存路径 + """ + # 1. 构建请求头(包含认证信息和内容类型) + headers = { + "Authorization": f"Bearer {API_KEY}", # API认证方式 + "Content-Type": "application/json" # 请求体为JSON格式 + } + + # 2. 构建请求体数据 + request_data = { + "model": "LongCat-Flash-Chat", # 使用的AI模型名称 + "messages": [ # 对话消息列表 + {"role": "system", "content": role_prompt}, # 系统角色提示 + {"role": "user", "content": text_html} # 用户输入(网页HTML文本) + ], + "max_tokens": 1000, # 生成的最大令牌数(控制响应长度) + "temperature": 0 # 生成随机性(0-1,值越高越随机) + } + + try: + # 3. 发送POST请求调用AI接口 + print(f"🔄 正在调用AI接口解析信息...") + response = requests.post( + url=API_BASE_URL, + headers=headers, + json=request_data, + timeout=30 # 设置30秒超时,避免无限等待 + ) + # 检查HTTP响应状态码,非200则抛出异常 + response.raise_for_status() + + # 4. 解析AI响应数据 + train_data = parse_ai_response(response.json()) + + # 5. 保存解析结果到指定文件 + if train_data is not None: + with open(save_path, 'w', encoding='utf-8') as f: + # 格式化保存JSON数据(确保中文正常显示,缩进4个空格) + json.dump(train_data, f, ensure_ascii=False, indent=4) + print(f"✅ 信息解析完成,已保存至: {save_path}") + else: + print(f"❌ 信息解析失败,未生成文件") + + # 可选:打印原始响应(方便调试) + # print("📝 AI接口原始响应:", json.dumps(response.json(), ensure_ascii=False, indent=2)) + + # 捕获网络请求相关异常 + except requests.exceptions.RequestException as e: + print(f"❌ 调用AI接口时发生网络错误: {e}") + # 捕获文件操作相关异常 + except IOError as e: + print(f"❌ 保存解析结果时发生文件错误: {e}") + +# ===================== 主程序执行 ===================== +if __name__ == "__main__": + # 定义AI的系统角色提示词(明确要求提取信息并返回JSON) + schema_desc = """ + 请提取网页中的文章列表。返回格式必须是合法的 JSON,结构如下: + { + "articles": [ + {"title": "文章标题", "publish_date": "发布日期", "author": "作者", "summary": "简短摘要"} + ] + } + """ + role_prompt = f""" + 你是一个专业的数据解析助手。请根据以下 HTML 内容,提取相关数据。 + + {schema_desc} + + 注意: + 1. 只返回纯 JSON 字符串,不要使用 markdown 格式。 + 2. 如果找不到数据,返回空列表。 + + HTML 内容片段: + {clean_content} + """ + # 待解析的网页HTML文本(替换为实际的HTML内容) + html_text = "" + + # 调用函数执行解析并保存结果 + ask_ai_train_parse(role_prompt, html_text, "test_parse.json")