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. 循环栅栏:CyclicBarrier(司令要求任务) 读书笔记

    可以理解为循环栅栏,栅栏就是一种障碍物.假如我们将计数器设置为10,那么凑齐第一批10个线程后,计数器就会归零,然后接着凑齐下一批10个线程,这就是循环栅栏的含义. 构造器: public Cycli ...

  2. vim 如何编辑 GB2312 编码的文件?

    vim 如何编辑 GB2312 编码的文件? 彻底搞清楚字符编码: ASCII, ISO_8859, GB2312,UCS, Unicode, U 结合file和iconv命令转换文件的字符编码类型 ...

  3. [置顶] 深入浅出Spring(四) Spring实例分析

    上次的博文中 深入浅出Spring(二) IoC详解 和 深入浅出Spring(三) AOP详解中,我们分别介绍了一下Spring框架的两个核心一个是IoC,一个是AOP.接下来我们来做一个Sprin ...

  4. Entity Framework Code First关系映射约定【l转发】

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  5. zookeeper 入门讲解实例 转

    转  http://www.blogjava.net/BucketLi/archive/2010/12/21/341268.html zookeeper使用和原理探究(一) zookeeper介绍zo ...

  6. hdu5293 Tree chain problem 树形dp+线段树

    题目:pid=5293">http://acm.hdu.edu.cn/showproblem.php?pid=5293 在一棵树中,给出若干条链和链的权值.求选取不相交的链使得权值和最 ...

  7. mark v1 SecurityConfig

    package cn.efunbox.cms.configuration; import cn.efunbox.afw.core.entity.ApiCode; import cn.efunbox.a ...

  8. Atitit.数据库新特性战略规划 mssql sql server 2008 SQL2012 SQL2014

    Atitit.数据库新特性 mssql sql server 2008 SQL2012 SQL2014 1. Sql2012 新特性 1 1.1. 增加了Sequence对象. 1 1.2. 新的分页 ...

  9. [svc]expect的爱恨情仇

    背景 openvpn生成证书想把它做成一键化,这样添加新用户时候就方便 遇到的问题 我的代码 gg_vpn_keys.exp #!/usr/bin/expect set user [lindex $a ...

  10. CSplashScene类

    #ifndef __TRANSITIONSCENE_H__ #define __TRANSITIONSCENE_H__ #include "GameFrameHead.h" cla ...