Heim >Backend-Entwicklung >PHP-Tutorial >简单php采集网页部分文字问题,求指点,多谢

简单php采集网页部分文字问题,求指点,多谢

WBOY
WBOYOriginal
2016-06-23 14:12:46814Durchsuche

本帖最后由 hi_5461 于 2013-06-09 15:54:50 编辑

目标采集页面如下代码(示例页面,数据可能变化,但格式不会变化)
要求得到table中主要的4项数据:序 号、违法时间、违法地点、违法行为(即93行~130行之间的)
希望能给出详细一点的php代码。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><base href="http://218.25.58.44:80/" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>交警查询</title><link href="style/style.css" rel="stylesheet" type="text/css" /><style>.center_td {	text-align:center;}</style></head><body><div class="top"><div class="menu"><ul><li><a href="#">网站首页</a></li><li> 沈阳交警</li><li> 交通新闻 </li><li> 视频播放 </li><li> 为您服务 </li><li> 在线办公 </li><li> 信息查询 </li><li> 征求意见 </li><li> 联系我们</ul></div><div class="txt"><!-- 沈阳小雨转小到中雨21~14   今天是:2010年5月28日    -->返回首页 / 设为首页 / 添加搜藏</div></div><div class="main"><table width="100%" border="0" cellspacing="0" cellpadding="0">  <tr>    <td valign="top" class="lmenu" >    <div class="l1">    <h1><a href="#"><img  src="images/cxx_04.png" border="0" / alt="简单php采集网页部分文字问题,求指点,多谢" ></a></h1>    <ul>    <li>业务指南</li>    <li>表格下载<br />机动车驾驶人身体条件证<br />机动车驾驶申请表…</li>    <li>自助报名</li>    <li>模拟考场</li>    <li>电子地图</li>    <li>网上车管所</li>    </ul>    </div>            <div class="l1 l2">    <h1><a href="#"><img  src="images/cxx_10.png" border="0" / alt="简单php采集网页部分文字问题,求指点,多谢" ></a></h1>    <ul>    <li>业务指南</li>    <li>表格下载<br />机动车驾驶人身体条件证<br />机动车驾驶申请表…</li>    <li>自助报名</li>    </ul>    </div>             <div class="l1 l3">    <h1><a href="#"><img  src="images/cxx_12.png" border="0" / alt="简单php采集网页部分文字问题,求指点,多谢" ></a></h1>    <ul>    <li>业务指南</li>    <li>表格下载<br />机动车驾驶人身体条件证<br />机动车驾驶申请表…</li>    <li>自助报名</li>    <li>模拟考场</li>    <li>电子地图</li>    <li>网上车管所</li>    </ul>    </div>     <div class="l1 l4">    <h1><a href="#"><img  src="images/cxx_14.png" border="0" / alt="简单php采集网页部分文字问题,求指点,多谢" ></a></h1>    <div class="video"><img  src="images/cxx_15.png" / alt="简单php采集网页部分文字问题,求指点,多谢" ></div>    <div class="video"><img  src="images/cxx_16.png" / alt="简单php采集网页部分文字问题,求指点,多谢" ></div>    </div>     <div class="kjc">    <img  src="images/cxx_17.png" / alt="简单php采集网页部分文字问题,求指点,多谢" >    </div>    </td>    <td valign="top">    <div class="content">    <h1>在线查询 / 电子警察拍照信息</h1>    <table width="100%" border="0" cellspacing="0" cellpadding="0" class="tab">            <tr>    	<td width="30"    style="max-width:90%" class="center_td"> </td>    	<td width="140" class="center_td">电子警察拍照信息</td>    	<td width="200" class="center_td">小型汽车</td>    	<td class="center_td">辽AQ007B</td>    </tr>    <tr>    	<td class="center_td" height="30">序 号</td>    	<td class="center_td">违法时间</td>    	<td class="center_td" width="200">违法地点</td>    	<td class="center_td">违法行为</td>    </tr>			<tr onmouseover="this.style.background='#DAE5FB';" onmouseout="this.style.background='#ffffff';">    	<td class="center_td" height="30">1</td>    	<td class="center_td">2013-02-0711:16</td>    	<td> 沈阳市永安路</td>    	<td> 违停,驾驶人不在现场,妨碍其他车辆行人通行的</td>  	</tr>  	<tr bgcolor="#e5e5e5" onmouseover="this.style.background='#DAE5FB';" onmouseout="this.style.background='#e5e5e5';">	    	<td class="center_td" height="30">2</td>    	<td class="center_td">2013-03-0808:34</td>    	<td> 沈阳市三好街文萃路由南向北</td>    	<td> 通过路口遇停止信号时,停在停止线以内或路口内的</td>  	</tr>  		<tr onmouseover="this.style.background='#DAE5FB';" onmouseout="this.style.background='#ffffff';">    	<td class="center_td" height="30">3</td>    	<td class="center_td">2013-03-2210:16</td>    	<td> 沈阳市三好街文萃路4号</td>    	<td> 违停,驾驶人不在现场,妨碍其他车辆行人通行的</td>  	</tr>  	<tr bgcolor="#e5e5e5" onmouseover="this.style.background='#DAE5FB';" onmouseout="this.style.background='#e5e5e5';">	    	<td class="center_td" height="30">4</td>    	<td class="center_td">2013-05-1413:53</td>    	<td> 沈阳市永安路</td>    	<td> 违停,驾驶人不在现场,妨碍其他车辆行人通行的</td>  	</tr>  		<tr onmouseover="this.style.background='#DAE5FB';" onmouseout="this.style.background='#ffffff';">    	<td class="center_td" height="30">5</td>    	<td class="center_td">2013-05-3113:29</td>    	<td> 沈阳市五里河街</td>    	<td> 违停,驾驶人不在现场,妨碍其他车辆行人通行的</td>  	</tr>            </table>    <table width="100%" height="43" border="0" cellpadding="0" cellspacing="0">      <tr>        <td width="121"><!-- <img  src="images/cxx_07.png"    style="max-width:90%"  style="max-width:90%" / alt="简单php采集网页部分文字问题,求指点,多谢" > --></td>        <td width="176"><!-- <img  src="images/cxx_08.png"    style="max-width:90%"  style="max-width:90%" / alt="简单php采集网页部分文字问题,求指点,多谢" > --></td>        <td width="176"><!-- <img  src="images/cxx_09.png"    style="max-width:90%"  style="max-width:90%" / alt="简单php采集网页部分文字问题,求指点,多谢" > --></td>        <td align="right">        <img  src="images/bk.png"   style="max-width:90%" onclick="javascript:history.back(-1);" / alt="简单php采集网页部分文字问题,求指点,多谢" >        </td>      </tr>    </table>    </div>    </td>  </tr></table></div><div class="foot"><p>友情连接:<select name="">  <option>所属单位</option></select>  <select name="select">    <option>所属单位</option>  </select>  <select name="select2">    <option>所属单位</option>  </select>  <select name="select3">    <option>所属单位</option>  </select>  <select name="select4">    <option>所属单位</option>  </select></p>Copyright 2009 www.sygajj.gov.cn All Rights Reserved<br />版权所有:沈阳市交通警察支队 E-maill:webmaster@www.sygajj.gov.cn 辽ICP备07501079号 邮编:110003<br />站长统计</div></body></html>

回复讨论(解决方案)

preg_match_all('#<td class="center_td"  style="max-width:90%">(\d+)</td>\s*<td class="center_td">(.+)</td>\s*<td>(.+)</td>\s*<td>(.+)</td>#isU',$s,$m);print_r($m);

preg_match_all('#<td class="center_td" height="30">(\d+)</td>\s*<td class="center_td">(.+)</td>\s*<td>(.+)</td>\s*<td>(.+)</td>#isU',$s,$m);print_r($m);

不用正则能实现吗?

你这个需求用正则是最方便的,还想怎么样。


preg_match_all('#<td class="center_td" height="30">(\d+)</td>\s*<td class="center_td">(.+)</td>\s*<td>(.+)</td>\s*<td>(.+)</td>#isU',$s,$m);print_r($m);

不用正则能实现吗?

正则在这种情况下使用是再好不过了

不知道我调用的对不对,但是输出结果中出现了我不想要的字符。

?Array(    [0] => Array        (            [0] => <td class="center_td" height="30">1</td>    	<td class="center_td">2013-02-0711:16</td>    	<td> 沈阳市永安路</td>    	<td> 违停,驾驶人不在现场,妨碍其他车辆行人通行的</td>            [1] => <td class="center_td" height="30">2</td>    	<td class="center_td">2013-03-0808:34</td>    	<td> 沈阳市三好街文萃路由南向北</td>    	<td> 通过路口遇停止信号时,停在停止线以内或路口内的</td>            [2] => <td class="center_td" height="30">3</td>    	<td class="center_td">2013-03-2210:16</td>    	<td> 沈阳市三好街文萃路4号</td>    	<td> 违停,驾驶人不在现场,妨碍其他车辆行人通行的</td>            [3] => <td class="center_td" height="30">4</td>    	<td class="center_td">2013-05-1413:53</td>    	<td> 沈阳市永安路</td>    	<td> 违停,驾驶人不在现场,妨碍其他车辆行人通行的</td>            [4] => <td class="center_td" height="30">5</td>    	<td class="center_td">2013-05-3113:29</td>    	<td> 沈阳市五里河街</td>    	<td> 违停,驾驶人不在现场,妨碍其他车辆行人通行的</td>        )    [1] => Array        (            [0] => 1            [1] => 2            [2] => 3            [3] => 4            [4] => 5        )    [2] => Array        (            [0] => 2013-02-0711:16            [1] => 2013-03-0808:34            [2] => 2013-03-2210:16            [3] => 2013-05-1413:53            [4] => 2013-05-3113:29        )    [3] => Array        (            [0] =>  沈阳市永安路            [1] =>  沈阳市三好街文萃路由南向北            [2] =>  沈阳市三好街文萃路4号            [3] =>  沈阳市永安路            [4] =>  沈阳市五里河街        )    [4] => Array        (            [0] =>  违停,驾驶人不在现场,妨碍其他车辆行人通行的            [1] =>  通过路口遇停止信号时,停在停止线以内或路口内的            [2] =>  违停,驾驶人不在现场,妨碍其他车辆行人通行的            [3] =>  违停,驾驶人不在现场,妨碍其他车辆行人通行的            [4] =>  违停,驾驶人不在现场,妨碍其他车辆行人通行的        ))

我是这样调用的:
$s = $p->post($remote_server,$post_string);preg_match_all('#<td class="center_td" height="30">(\d+)</td>\s*<td class="center_td">(.+)</td>\s*<td>(.+)</td>\s*<td>(.+)</td>#isU',$s,$m);print_r($m);

上面的结果中,从第3行至第25行,是我不想要的,而且第47行中出现了空格,这也不是我想要的,求解决代码,多谢!

$s = $p->post($remote_server,$post_string);preg_match_all('#<td class="center_td" height="30">(\d+)</td>\s*<td class="center_td">(.+)</td>\s*<td>(?: )*(.+)</td>\s*<td>(?: )*(.+)</td>#isU',$s,$m);print_r($m);

$m 的 1 到 4 下标依次表示为 序号、时间、地点、内容

$s = $p->post($remote_server,$post_string);preg_match_all('#<td class="center_td" height="30">(\d+)</td>\s*<td class="center_td">(.+)</td>\s*<td>(?: )*(.+)</td>\s*<td>(?: )*(.+)</td>#isU',$s,$m);print_r($m);

$m 的 1 到 4 下标依次表示为 序号、时间、地点、内容
试了一下,结果还是与原来的一样,空格字符没能过滤掉

preg_match_all('#

(\d+)\s*(.+)\s* (.+)\s* (.+)#isU',$s,$m);

preg_match_all('#

(\d+)\s*(.+)\s* (.+)\s* (.+)#isU',$s,$m);
这回正确了
还有个小问题,就是我得到的$m有时会是空数组,没有值,这个怎么能判断一下呢?因为不能正确得到结果时我需要重新执行一遍查询,谢谢!以下是返回空数组时的结果:
Array(    [0] => Array        (        )    [1] => Array        (        )    [2] => Array        (        )    [3] => Array        (        )    [4] => Array        (        ))

为空时你的数据不是上面那种格式吧,你判断$m[0] 是否为空数组就可以了。
if(empty($m[0])){
     重新执行一遍查询
}

为空时你的数据不是上面那种格式吧,你判断$m[0] 是否为空数组就可以了。
if(empty($m[0])){
     重新执行一遍查询
}
让你说着了,为空时,不是上面的格式,正则会出错,呵呵,所以判断要在正则之前了。应该判断$s里是否有“验证码输入有误,请重新输入!”,但不知道怎么写?

<td colspan="2">    			验证码输入有误,请重新输入!	    	        </td>

用strpos() 判断就行吧?

出错时会出现上面那个提示是吧?

if(strpos($s,'验证码输入有误,请重新输入!') !==false){
   .....重新执行一遍查询....
}

出错时会出现上面那个提示是吧?

if(strpos($s,'验证码输入有误,请重新输入!') !==false){
   .....重新执行一遍查询....
}
又遇到个需要正则的地方,我不会写,帮我看下吧,多谢了
目标页面地址:http://218.25.58.44/searchsys/
需要采集的数据是:“数据最后更新至2013年6月9日”
求规则!

目标在183行,下面是这个页面的源码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><base href="http://218.25.58.44:80/" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>交警查询</title><link href="style/style.css" rel="stylesheet" type="text/css" /><script>function trim(val) {	var str = val+"";	if (str.length == 0) return str;	var re = /^\s*/;	str = str.replace(re,'');	re = /\s*$/;	return str.replace(re,'');}function chkForm1(form) {	if ((trim(form("wzcx.autono").value) == "") || (trim(form("wzcx.autono").value).length < 7)) {		alert("请输入有效的车牌号!");		form("wzcx.autono").focus();		return false;	}	if ((trim(form("wzcx.memo").value) == "") || (trim(form("wzcx.memo").value).length < 4)) {		alert("请输入车辆识别代码后四位!");		form("wzcx.memo").focus();		return false;	}	if (trim(form("rand").value) == "") {		alert("请输入验证码!");		form("rand").focus();		return false;	}}function chkForm2(form) {	if (trim(form.cardno.value) == "") {		alert("请输入有效的档案编号!");		form.cardno.focus();		return false;	}	if (trim(form.idno.value) == "") {		//alert("请输入有效的证件号码!");		alert("请输入有效的身份证号码!");		form.idno.focus();		return false;	}	if (trim(form.rand2.value) == "") {		alert("请输入验证码!");		form.rand2.focus();		return false;	}}</script></head><body><div class="top"><div class="menu"><ul><li><a href="#">网站首页</a></li><li> 沈阳交警</li><li> 交通新闻 </li><li> 视频播放 </li><li> 为您服务 </li><li> 在线办公 </li><li> 信息查询 </li><li> 征求意见 </li><li> 联系我们</ul></div><div class="txt"><!-- 沈阳小雨转小到中雨21℃~14℃   今天是:2010年5月28日    -->返回首页 / 设为首页 / 添加搜藏</div></div><div class="main"><table width="100%%" border="0" cellspacing="0" cellpadding="0">  <tr>    <td valign="top" class="lmenu" >    <div class="l1">    <h1><a href="#"><img  src="images/cxx_04.png" border="0" / alt="简单php采集网页部分文字问题,求指点,多谢" ></a></h1>    <ul>    <li>业务指南</li>    <li>表格下载<br />机动车驾驶人身体条件证<br />机动车驾驶申请表…</li>    <li>自助报名</li>    <li>模拟考场</li>    <li>电子地图</li>    <li>网上车管所</li>    </ul>    </div>            <div class="l1 l2">    <h1><a href="#"><img  src="images/cxx_10.png" border="0" / alt="简单php采集网页部分文字问题,求指点,多谢" ></a></h1>    <ul>    <li>业务指南</li>    <li>表格下载<br />机动车驾驶人身体条件证<br />机动车驾驶申请表…</li>    <li>自助报名</li>    </ul>    </div>             <div class="l1 l3">    <h1><a href="#"><img  src="images/cxx_12.png" border="0" / alt="简单php采集网页部分文字问题,求指点,多谢" ></a></h1>    <ul>    <li>业务指南</li>    <li>表格下载<br />机动车驾驶人身体条件证<br />机动车驾驶申请表…</li>    <li>自助报名</li>    <li>模拟考场</li>    <li>电子地图</li>    <li>网上车管所</li>    </ul>    </div>     <div class="l1 l4">    <h1><a href="#"><img  src="images/cxx_14.png" border="0" / alt="简单php采集网页部分文字问题,求指点,多谢" ></a></h1>    <div class="video"><img  src="images/cxx_15.png" / alt="简单php采集网页部分文字问题,求指点,多谢" ></div>    <div class="video"><img  src="images/cxx_16.png" / alt="简单php采集网页部分文字问题,求指点,多谢" ></div>    </div>     <div class="kjc">    <img  src="images/cxx_17.png" / alt="简单php采集网页部分文字问题,求指点,多谢" >    </div>    </td>    <td valign="top">    <div class="content">    <p> </p>    <table width="100%%"    style="max-width:90%" border="0" cellpadding="3" cellspacing="0">	<!-- 电子警察拍照信息 -->	<tr>		<td width="78" height="44">		    <b>电子警察拍照信息</b></td>	</tr>	<form action="search/wzcxrs.action" method="post" name="wfxxForm" id="wfxxForm" onsubmit="return chkForm1(this);">	<tr>		<td height="44"><table width="100%" border="0" cellspacing="3" cellpadding="1">  <tr>    <td>车型      <select name="wzcx.autotype" id="wzcx.autotype" style="width:90px;">        <option value="小型汽车">小型汽车</option>        <option value="大型汽车">大型汽车</option>        <option value="外籍汽车">外籍汽车</option>        <option value="临时行驶车">临时行驶车</option>        <option value="挂车">挂车</option>        <option value="原农机号牌">原农机号牌</option>        <option value="农用运输车">农用运输车</option>      </select></td>    <td>车牌号      <input name="wzcx.autono" type="text" class="input" id="wzcx.autono" size="8" maxlength="20" value="辽A" onkeyup="this.value=this.value.toUpperCase();" /></td>    <td>车辆识别代码后四位      <input name="wzcx.memo" type="text" class="input" id="wzcx.memo" size="5" maxlength="4" onkeyup="this.value=this.value.toUpperCase();" /></td>    <td>验证码<span style="font-size:18px; font-weight:bold; color:#CA0906; ">      <input name="rand" type="text" class="input" id="rand" size="5" maxlength="4" />      <img id="img1" src="/searchsys/img.jsp" width="55"    style="max-width:90%" border="0" onclick="javascript:this.src='/searchsys/img.jsp';" alt="看不清,请点击" style="cursor:hand;"/></span></td>    <td><input type="image" src="images/cxx_06.png" width="78" height="24" /></td>    </tr></table>		  <br /></td>	</tr>	  </form>	  <!-- 驾驶员积分信息 -->	  <tr>		<td height="43">		    <b>驾驶员信息</b></td>	  </tr>	  <form action="search/jsyxxrs.action" method="post" name="jsyxxForm" id="jsyxxForm" onsubmit="return chkForm2(this);">	  <tr>		<td height="43"><table width="100%" border="0" cellspacing="3" cellpadding="1">		  <tr>		    <td><!--证件类型-->档案编号		      <!--<select name="idtype" id="idtype" style="width:100px;">		        <option value="1">档案编号</option>		        <option value="2">身份证号</option>		        </select>-->		      <input name="cardno" type="text" class="input" id="cardno" size="18" maxlength="50" /></td>		    <td><!--号码-->身份证号码		      <input name="idno" type="text" class="input" id="idno" size="22" maxlength="50" /></td>		    <td>验证码<span style="font-size:18px; font-weight:bold; color:#CA0906; ">		      <input name="rand2" type="text" class="input" id="rand2" size="5" maxlength="4" />              <img src="/searchsys/img2.jsp" width="55"    style="max-width:90%" border="0" onclick="javascript:this.src='/searchsys/img2.jsp';" alt="看不清,请点击" style="cursor:hand;"/> </span></td>		    <td><input type="image" src="images/cxx_06.png" width="78" height="24" /></td>		    </tr>		  </table>		  <br /></td>	  </tr>	  </form>    </table>    <div>    <br/><center>      <!--img src="sm.gif" width="531" height="239" /-->    </center><br/>    <hr/><br/>	<center>数据最后更新至2013年6月9日</center>        </div>	<!-- 按按 --    <table width="100%%" height="76" border="0" cellpadding="0" cellspacing="0">      <tr>        <td width="121"><!-- <img  src="images/cxx_07.png"    style="max-width:90%"  style="max-width:90%" / alt="简单php采集网页部分文字问题,求指点,多谢" > --></td>        <td width="176"><!-- <img  src="images/cxx_08.png"    style="max-width:90%"  style="max-width:90%" / alt="简单php采集网页部分文字问题,求指点,多谢" > --></td>        <td width="176"><!-- <img  src="images/cxx_09.png"    style="max-width:90%"  style="max-width:90%" / alt="简单php采集网页部分文字问题,求指点,多谢" > --></td>        <td align="right"></td>      </tr>    </table>	    </div>    </td>  </tr></table></div><div class="foot"><p>友情连接:<select name="">  <option>所属单位</option></select>  <select name="select">    <option>所属单位</option>  </select>  <select name="select2">    <option>所属单位</option>  </select>  <select name="select3">    <option>所属单位</option>  </select>  <select name="select4">    <option>所属单位</option>  </select></p>Copyright 2009 www.sygajj.gov.cn All Rights Reserved<br />版权所有:沈阳市交通警察支队 E-maill:webmaster@sygajj.gov.cn 辽ICP备07501079号 邮编:110003<br /><script src="http://s11.cnzz.com/stat.php?id=2228263&web_id=2228263" language="JavaScript"></script></div></body></html>

preg_match('#

(.+?)
#',$s,$m);
echo $m[1];

女生的问题回答就是快哦。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn