PHP—万能获取HTML表格内容并写入数据库(终极杀器)

使用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数组的内容是这样的
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值