网页抓取信息(php正則表達式、php操作excel)
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)的更多相关文章
- Python正則表達式:怎样使用正則表達式
正則表達式(简称RE)本质上能够看作一个小的.高度专业化的编程语言,在Python中能够通过re模块使用它.使用正則表達式,你须要为想要匹配的字符串集合指定一套规则,字符串集合能够包括英文句子.e-m ...
- VB.NET利用正則表達式巧妙限制字符输入
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u010028869/article/details/37913867 在通常的程序设计中.对 ...
- 【iOS】正則表達式抓取网页数据制作小词典
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/xn4545945/article/details/37684127 应用程序不一定要自己去提供数据. ...
- vb.net 正則表達式 取 固定格式的字符
vb.net 正則表達式 取 固定格式的字符: 原始字符串:strSqlTmp="select * from A_TEST where a_data = '@1@' and b_link = ...
- JavaScript 正則表達式
一.简单介绍 1.什么是正則表達式 正則表達式本身就是一种语言,这在其他语言是通用的. 正則表達式(regular expression)描写叙述了一种字符串匹配的模式,能够用来检查一个串是否含有某种 ...
- Java正則表達式入门
众所周知,在程序开发中,难免会遇到须要匹配.查找.替换.推断字符串的情况发生,而这些情况有时又比較复杂,假设用纯编码方式解决,往往会浪费程序猿的时间及精力.因此,学习及使用正則表達式,便成了解决这一 ...
- python 学习笔记 10 -- 正則表達式
零.引言 在<Dive into Python>(深入python)中,第七章介绍正則表達式,开篇非常好的引出了正則表達式,以下借用一下:我们都知道python中字符串也有比較简单的方法, ...
- 黑马程序猿————Java基础日常笔记---反射与正則表達式
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...
- 辛星教你高速掌握PHP的正則表達式
首先说一下,这篇文章也是我在看了数个大牛的博客之后总结出来的,因此首先向这些大牛表示崇高的敬意和感谢,因为人数众多.并且来源也是特别分散,就不一一介绍了,见谅. ************跨语言的主题* ...
随机推荐
- Oracle PL/SQL语句基础学习笔记(上)
PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE server和其它工具中了,近几年中很多其它的开发者和DBA開始使用PL/SQL,本文将讲述PL ...
- FFMPEG中最要害的结构体之间的关系
FFMPEG中最关键的结构体之间的关系 http://www.myexception.cn/program/1404591.html FFMPEG中结构体很多.最关键的结构体可以分成以下几类: a) ...
- Linux 安装tomcat 及过程中遇到的问题
Linux 安装tomcat(tomcat能用的前提是系统已经安装jdk) 1.下载linux系统版tomcat,解压后通过ftp上传到Linux服务器 例:tomcat放在 /opt/tom ...
- Web中树形数据(层级关系数据)的实现—以行政区树为例
在Web开发中常常遇到树形数据的操作,如菜单.组织机构.行政区(省.市.县)等具有层级关系的数据. 以下以行政区为例说明树形数据(层级关系数据)的存储以及实现,效果如图所看到的. 1 数据库表结构设计 ...
- P2P原理
简单介绍 前面文章在分布式计算泛型中介绍过P2P泛型.他是一种是一种无中心server的对等网络泛型. P2P即Peer-to-Peer的缩写.翻译为点对点或者端对端.就是我们常说的对等计算. P2P ...
- 【TP5.0】引入public/static目录下的静态资源
1.假设tp5 下只有一个项目,且application在tp5下, 2.我们知道 外界访问tp5项目,只能通过public/index.php的入口文件,且查看apache服务器我们知道, [DOC ...
- nginx根据token做频率限制
在 nginx.conf 文件添加配置 limit_conn_log_level error; limit_conn_status ; limit_conn_zone $cookie_gray_DF_ ...
- List、Set、Map常见集合遍历总结
Java中的集合有三大类,List.Set.Map,都处于java.util包中,List.Set和Map都是接口,不能被实例化,它们的各自的实现类可以被实例化.List的实现类主要有ArrayLis ...
- Web应用程序项目OxiteSite已配置为使用IIS.在本地计算机上找不到服务器
今天还是没事干(我的博客还想都是以这句话开始的),看看小组里边的文章Oxite初探.下载Oxite的41500版本,打开后遇到这样的问题.如下图所示 解决方法: 1.邮件点击OxiteSite项目,选 ...
- Android Context原理与使用的总结
一.Context继承体系 与 Context是怎样创建的 1. Context继承体系 仅仅用记住一句:Activity . Service 与Application 都是继承自ContextWra ...