网页抓取信息(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的正則表達式
首先说一下,这篇文章也是我在看了数个大牛的博客之后总结出来的,因此首先向这些大牛表示崇高的敬意和感谢,因为人数众多.并且来源也是特别分散,就不一一介绍了,见谅. ************跨语言的主题* ...
随机推荐
- 分治算法——Karastsuba算法
分治(Divide and Conquer)算法:问题能够分解为子问题,每一个问题是能够独立的解决的,从子问题的解能够构建原问题. Divide:中间分.随机分.奇偶分等,将问题分解成独立的子问题 C ...
- Python MongoDB Spatial Query
//引入Pymongo >>> from pymongo import MongoClient,GEO2D // 链接数据库gis >>> db = MongoCl ...
- 使用HTML5的两个api,前端js完成图片压缩
主要用了两个html5的 API,一个file,一个canvas,压缩主要使用cnavas做的,file是读取文件,之后把压缩好的照片放入内存,最后内存转入表单下img.src,随着表单提交. 照片是 ...
- 算法笔记_016:凸包问题(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力法 1 问题描述 给定一个平面上n个点的集合,它的凸包就是包含所有这些点的最小凸多边形,求取满足此条件的所有点. 另外,形象生动的描述: (1)我们可以把 ...
- vagrant box各种命令汇总
最近在研究laravel,中间用到了vagrant 虚拟机管理工具,学习一下他的命令 vagrant box命令 用于管理boxes的命令,比如添加.删除等等. 此命令的功能主要通过以下子命令完成: ...
- JDBC 事务(一) 隔离级别
public class TxTest { public static void main(String[] args) throws SQLException { test(); ...
- 用python实现的的手写数字识别器
概述 带GUI界面的,基于python sklearn knn算法的手写数字识别器,可用于识别手写数字,训练数据集为mnist. 详细 代码下载:http://www.demodashi.com/de ...
- 【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 ...
- freeswitch编译java esl
一.背景假设源代码路径为/home/freeswitch 二.编译安装libesl.a1. cd /home/freeswitch(源代码的根目录) 执行./configure,以便生成必要的Make ...
- 使用 SSHFS 挂载远程的 Linux 文件系统及目录
1. 安装 sudo apt-get install sshfs 2. 创建 SSHFS 挂载目录 sudo mkdir /mnt/cong 3.使用 SSHFS 挂载远程的文件系统 sudo ssh ...