使用PHP读取网页,网页里面有表格,如何获取表格内容呢?比如这个网页:
里面有很一个很大的表格,读取方式如下:
<?php
$url="https://www.immd.gov.hk/hks/stat_20200916.html";
$info = https_get($url,10); #10秒超时
$res = getTableData($info); #解析请求的返回结果
echo '<pre>';
print_r($res);
//发起https的get请求
function https_get($url,$timeout=120){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT,$timeout);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 跳过检查
$res = curl_exec($curl);
curl_close($curl);
return $res; //返回json对象
}
//解析HMTL的表格数据
function getTableData($info){
$info = str_replace(array("--","<br/>","\t","\r\n","\r","\n"),"",$info);
preg_match_all("/<table[^>]+[^>]*>(.*?)<\/table>/", $info, $content); //获取table内容
$content = $content[1][0];
$content = preg_replace("'<tr[^>]*?>'si","",$content); //替换前面的tr为空
$content = preg_replace("'<td[^>]*?>'si","",$content); //替换前面的td为空
$content = str_replace("</tr>","{tr}",$content);
$content = str_replace("</td>","{td}",$content);
$content = preg_replace("'<[/!]*?[^<>]*?>'si","",$content); //替换其他多余的标签
$content = preg_replace("'([rn])[s]+'","",$content); //替换换行符和空格
$content = str_replace(" ","",$content);
$content = explode('{tr}', $content); //tr分割
array_pop($content); //最后一个元素为空
$res=[];
foreach ($content as $key=>$tr) { //遍历每一行
$line = explode('{td}', $tr);
array_pop($line); //最后一个元素为空
if(sizeof($line)>1) //不是空行
$res[] = $line;
}
return $res;
}
<?>
这里的关键就是getTableData函数,如何通过正则匹配获取表格内容的。
执行结果如下,可以自己复制代码跑一下。
获取到结果数组后,就是要解析并且插入数据库了 接着上面的代码
$data=[]; //承接分析结果的数组
foreach($res as $line){
if(in_array('机场', $line)){
$data['in_air_hk']=$line[5];
$data['out_air_hk']=$line[10];
$data['in_air_ma']=$line[6];
$data['out_air_ma']=$line[11];
$data['in_air_ot']=$line[7];
$data['out_air_ot']=$line[12];
}
if(in_array('港珠澳大桥', $line)){
$data['in_ro_hk']=$line[5];
$data['out_ro_hk']=$line[10];
$data['in_ro_ma']=$line[6];
$data['out_ro_ma']=$line[11];
$data['in_ro_ot']=$line[7];
$data['out_ro_ot']=$line[12];
}
if(in_array('深圳湾', $line)){
$data['in_sz_hk']=$line[5];
$data['out_sz_hk']=$line[10];
$data['in_sz_ma']=$line[6];
$data['out_sz_ma']=$line[11];
$data['in_sz_ot']=$line[7];
$data['out_sz_ot']=$line[12];
}
if(in_array('总计', $line)){
$data['in_total_hk']=$line[5];
$data['out_total_hk']=$line[10];
$data['in_total_ma']=$line[6];
$data['out_total_ma']=$line[11];
$data['in_total_ot']=$line[7];
$data['out_total_ot']=$line[12];
}
}
$data=intarr($data); //内容整数化
$data['date']=$date; //日期一般是参数代入
$sql=sqlreplace($data,"hkports"); //数组解析为sql语句
$con=conmysqli();
$res=mysqli_query($con,$sql); //插入数据库
if($res){
$result['flag']="success";
$result['msg']="日期".$date."香港出入境数据插入成功";
}
else{
$result['flag']="error";
$result['msg']="日期".$date."香港出入境数据不能重复插入";
}
echo json_encode($result);
//整数化数组的元素
function intarr($arr){
foreach ($arr as $key => $line){
$temp=str_replace(",","",$line);
$arr[$key]=(int)($temp);
}
return $arr;
}
//连接mysql的函数
function conmysqli() {
$con = mysqli_connect("127.0.0.1","username","password"); //数据库的用户名密码
mysqli_select_db($con,"economy");
mysqli_query($con,"set names utf8");
return $con;
}
//二维数组转换为sql语句
function sqlreplace($data,$table){
$seglist=array_keys($data);
$valuelist=array_values($data);
$columns='`'.implode('`,`',$seglist).'`';
$values="'".implode("','",$valuelist)."'";
$sql = "replace into $table ($columns) values ($values)";
return $sql;
}
而$data数组的内容是这样的