1.问题描写叙述

实现对固定网页上自己须要的信息抓取,以表格形式存储。

我是拿wustoj上的一个排行榜来练习的,地址:wustoj

2.思路

网页自己就简单学习了一下php,刚好用它来做点事情吧,我的想法是这种:

(1)查看网页源码并保存在文件里。

(2)依据须要的信息写出正則表達式。读文件,依据正則表達式来提取须要的信息。写正則表達式的时候最好分组,这样提取起来就方便了非常多。

(3)对excel操作。将提取的信息以excel的形式输出。

比較好的开源php处理excel类链接:点击打开链接

3.体会

^是指要是原字符串的开头。$是指要是原字符串的结尾。

空字符不一定是空格。

用()来分组是好方法,如preg_macth_all(/$pattern/,$subject,matches)。

matches为二维数组,假设没有_all。则仅仅会匹配第一部分,是一维数组。

$matches[0]保存完整模式的全部匹配。$matches[1]保存第一子组全部匹配,即全部匹配的第一部分。

中文匹配串我用的这个$patt_ch=chr(0x80)."-".chr(0xff)。

4.代码

<?php
header("Content-Type: text/html; charset=utf-8"); $url = "http://acm.wust.edu.cn/contestrank.php?cid=1014";
$result=file_get_contents($url);
$file=fopen("content.php","w");
fwrite($file,$result);
$file=fopen("content.php","r"); $patt_ch=chr(0x80)."-".chr(0xff);
// <td>1<td
$rankpatt="(<td>)([0-9]+|\*)(<td)"; // part2
//<a href=status.php?user_id=team30&cid=1014>team30_姓名</a>
$namepatt="(<a[[:space:]]href=status\.php\? user_id=team[0-9]+&cid=1014>)(\*{0,1}team[0-9]+)(_)([$patt_ch]+)(<\/a>)"; // part2 part4
//$namepatt="(team[0-9]+)(_)([$patt_ch]+)"; 也能够用这个直接匹配"team_姓名"
//<a href=status.php?user_id=team30&cid=1014&jresult=4>7</a>
$problempatt="(<a[[:space:]]href=status\.php\?user_id=team[0-9]+&cid=1014&jresult=4>)([0-9]+)(<\/a>)"; //Include class
require_once('Classes/PHPExcel.php');
require_once('Classes/PHPExcel/Writer/Excel2007.php');
$objPHPExcel = new PHPExcel(); //Set properties 设置文件属性
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw");
$objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");
$objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");
$objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");
$objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");
$objPHPExcel->getProperties()->setKeywords("office 2007 openxml php");
$objPHPExcel->getProperties()->setCategory("Test result file"); $row=1;
$objPHPExcel->getActiveSheet()->setCellValue('A'.$row, 'rank');
$objPHPExcel->getActiveSheet()->setCellValue('B'.$row, 'team');
$objPHPExcel->getActiveSheet()->setCellValue('C'.$row, 'solved');
while(!feof($file))
{
//echo $row." ";
$line=fgets($file);
if(preg_match("/$rankpatt/",$line,$match))
{
$row++;
//print_r ($match);
//echo $match[2]." ";
//echo "<br>";
$objPHPExcel->getActiveSheet()->setCellValue('A'.$row, $match[2]);
$objPHPExcel->getActiveSheet()->getStyle('A'.$row)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
}
if(preg_match("/$namepatt/",$line,$match))
{
//print_r ($match);
//echo $match[2]." ".$match[4]." ";
//echo "<br>";
$objPHPExcel->getActiveSheet()->setCellValue('B'.$row, $match[2].$match[4]);
}
if(preg_match("/$problempatt/",$line,$match))
{
//print_r ($match);
//echo $match[2]." ";
//echo "<br>";
$objPHPExcel->getActiveSheet()->setCellValue('C' . $row, $match[2]);
$objPHPExcel->getActiveSheet()->getStyle('C'.$row)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
}
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter->save(str_replace('.php', '.xlsx', __FILE__));
}
echo "well done:)";
?>

5.执行结果

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG9iZXdoYXR5b3V3YW50dG9iZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

网页抓取信息(php正則表達式、php操作excel)的更多相关文章

  1. Python正則表達式:怎样使用正則表達式

    正則表達式(简称RE)本质上能够看作一个小的.高度专业化的编程语言,在Python中能够通过re模块使用它.使用正則表達式,你须要为想要匹配的字符串集合指定一套规则,字符串集合能够包括英文句子.e-m ...

  2. VB.NET利用正則表達式巧妙限制字符输入

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u010028869/article/details/37913867     在通常的程序设计中.对 ...

  3. 【iOS】正則表達式抓取网页数据制作小词典

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/xn4545945/article/details/37684127 应用程序不一定要自己去提供数据. ...

  4. vb.net 正則表達式 取 固定格式的字符

    vb.net 正則表達式 取 固定格式的字符: 原始字符串:strSqlTmp="select * from A_TEST where a_data = '@1@' and b_link = ...

  5. JavaScript 正則表達式

    一.简单介绍 1.什么是正則表達式 正則表達式本身就是一种语言,这在其他语言是通用的. 正則表達式(regular expression)描写叙述了一种字符串匹配的模式,能够用来检查一个串是否含有某种 ...

  6. Java正則表達式入门

     众所周知,在程序开发中,难免会遇到须要匹配.查找.替换.推断字符串的情况发生,而这些情况有时又比較复杂,假设用纯编码方式解决,往往会浪费程序猿的时间及精力.因此,学习及使用正則表達式,便成了解决这一 ...

  7. python 学习笔记 10 -- 正則表達式

    零.引言 在<Dive into Python>(深入python)中,第七章介绍正則表達式,开篇非常好的引出了正則表達式,以下借用一下:我们都知道python中字符串也有比較简单的方法, ...

  8. 黑马程序猿————Java基础日常笔记---反射与正則表達式

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...

  9. 辛星教你高速掌握PHP的正則表達式

    首先说一下,这篇文章也是我在看了数个大牛的博客之后总结出来的,因此首先向这些大牛表示崇高的敬意和感谢,因为人数众多.并且来源也是特别分散,就不一一介绍了,见谅. ************跨语言的主题* ...

随机推荐

  1. 分治算法——Karastsuba算法

    分治(Divide and Conquer)算法:问题能够分解为子问题,每一个问题是能够独立的解决的,从子问题的解能够构建原问题. Divide:中间分.随机分.奇偶分等,将问题分解成独立的子问题 C ...

  2. Python MongoDB Spatial Query

    //引入Pymongo >>> from pymongo import MongoClient,GEO2D // 链接数据库gis >>> db = MongoCl ...

  3. 使用HTML5的两个api,前端js完成图片压缩

    主要用了两个html5的 API,一个file,一个canvas,压缩主要使用cnavas做的,file是读取文件,之后把压缩好的照片放入内存,最后内存转入表单下img.src,随着表单提交. 照片是 ...

  4. 算法笔记_016:凸包问题(Java)

    目录 1 问题描述 2 解决方案 2.1 蛮力法 1 问题描述 给定一个平面上n个点的集合,它的凸包就是包含所有这些点的最小凸多边形,求取满足此条件的所有点. 另外,形象生动的描述: (1)我们可以把 ...

  5. vagrant box各种命令汇总

    最近在研究laravel,中间用到了vagrant 虚拟机管理工具,学习一下他的命令 vagrant box命令 用于管理boxes的命令,比如添加.删除等等. 此命令的功能主要通过以下子命令完成: ...

  6. JDBC 事务(一) 隔离级别

    public class TxTest { public static void main(String[] args) throws SQLException {         test();   ...

  7. 用python实现的的手写数字识别器

    概述 带GUI界面的,基于python sklearn knn算法的手写数字识别器,可用于识别手写数字,训练数据集为mnist. 详细 代码下载:http://www.demodashi.com/de ...

  8. 【LeetCode】117. Populating Next Right Pointers in Each Node II (2 solutions)

    Populating Next Right Pointers in Each Node II Follow up for problem "Populating Next Right Poi ...

  9. freeswitch编译java esl

    一.背景假设源代码路径为/home/freeswitch 二.编译安装libesl.a1. cd /home/freeswitch(源代码的根目录) 执行./configure,以便生成必要的Make ...

  10. 使用 SSHFS 挂载远程的 Linux 文件系统及目录

    1. 安装 sudo apt-get install sshfs 2. 创建 SSHFS 挂载目录 sudo mkdir /mnt/cong 3.使用 SSHFS 挂载远程的文件系统 sudo ssh ...