如何将Laravel控制器中的$url变量传递至Python脚本?
解决方案:传递动态URL给Python脚本并提取网页表格
一、PHP端:传递URL作为命令行参数
修改原代码中调用Python脚本的部分,将生成的$url作为命令行参数传入:
$client = new Client(); $a = 'https://scholar.google.com/citations?user='; $gscID = 'EnegzCwAAAAJ';//示例ID $b = '&hl=en&oi=ao'; $url = $a . $gscID . $b; // 修改Process参数,添加$url作为命令行参数 $process = new Process([ 'python', public_path() . '\ext.py', $url // 把动态生成的URL传给Python脚本 ], null, ['SYSTEMROOT' => getenv('SYSTEMROOT'), 'PATH' => getenv("PATH")]); $process->run(); if (!$process->isSuccessful()) { throw new ProcessFailedException($process); } $out[] = $process->getOutput(); dd($out);
二、Python端(ext.py):接收URL并提取表格
在ext.py中通过sys.argv获取传递的URL,然后使用网页解析库提取表格。以下是示例代码(需提前安装依赖:pip install requests pandas):
import sys import requests import pandas as pd def extract_table_from_url(url): # 模拟浏览器请求,避免反爬拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } response = requests.get(url, headers=headers) response.raise_for_status() # 捕获请求错误 # 读取页面中所有表格,取第一个(可根据实际调整索引) tables = pd.read_html(response.text) target_table = tables[0] # 转为制表符分隔的字符串,方便PHP接收解析 return target_table.to_csv(sep='\t', index=False) if __name__ == "__main__": # 校验参数是否存在 if len(sys.argv) < 2: print("Error: 未传入URL参数") sys.exit(1) target_url = sys.argv[1] table_content = extract_table_from_url(target_url) print(table_content)
补充说明
- 命令行参数传递URL是最直接的方式,无需额外处理文件或环境变量,适配动态URL场景
- 若需要更精细的表格解析,可替换
pandas为BeautifulSoup手动遍历<table>标签的行和列 - 需确保Python环境已安装所需依赖,且PHP进程有权限调用Python命令
内容的提问来源于stack exchange,提问作者Ana Fernandes
相关产品推荐
相关产品推荐

