php抓取了一个web页面,有没有比较简便的方法访问页面元素?需求描述:做一个php程序,第隔一段时间访问某个网页,将网页表格里面的数字累加(网页的格式稳定,不会经常改动)。比如抓到:
<html>
<head></head>
<body>
<table name="MainTable" bgcolor="#CCCCCC" width="100%" border="0" cellpadding="0" cellspacing="1">
<tr>
<td class="subtitle" rowspan=2>方向</td>
<td class="subtitle" colspan=2>输入</td>
<td class="subtitle" colspan=2>滤后</td>
<td class="subtitle" rowspan=2>其它</td>
</tr>
<tr>
<td class="subtitle">流量</td>
<td class="subtitle">报文</td>
<td class="subtitle">流量</td>
<td class="subtitle">报文</td>
</tr>
<tr>
<td width="20%">外网接口</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">3 pps</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">0 pps</td>
<td width="20%" rowspan=2 style="text-align:left;padding-left:20px">
伪造地址 0.00 Mbps<br>
路由丢失 0.00 Mbps
</td>
</tr>
<tr>
<td width="20%">内网接口</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">1 pps</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">0 pps</td>
</tr>
</table>
</body>
</html>有没有简单的办法访问到类似<td width="15%">3 pps</td>这一行?谢谢(我本来打算用正则表达式的,但通用性不好,需要针对不同网页修改正刚表达式。然后又想用解析xml的办法来解析html,但错误百出。 现在想知道:能否按元素访问html内容,比如javascript里面可以用document.all("MainTable").(…)这样的方法来访问。)
<html>
<head></head>
<body>
<table name="MainTable" bgcolor="#CCCCCC" width="100%" border="0" cellpadding="0" cellspacing="1">
<tr>
<td class="subtitle" rowspan=2>方向</td>
<td class="subtitle" colspan=2>输入</td>
<td class="subtitle" colspan=2>滤后</td>
<td class="subtitle" rowspan=2>其它</td>
</tr>
<tr>
<td class="subtitle">流量</td>
<td class="subtitle">报文</td>
<td class="subtitle">流量</td>
<td class="subtitle">报文</td>
</tr>
<tr>
<td width="20%">外网接口</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">3 pps</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">0 pps</td>
<td width="20%" rowspan=2 style="text-align:left;padding-left:20px">
伪造地址 0.00 Mbps<br>
路由丢失 0.00 Mbps
</td>
</tr>
<tr>
<td width="20%">内网接口</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">1 pps</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">0 pps</td>
</tr>
</table>
</body>
</html>有没有简单的办法访问到类似<td width="15%">3 pps</td>这一行?谢谢(我本来打算用正则表达式的,但通用性不好,需要针对不同网页修改正刚表达式。然后又想用解析xml的办法来解析html,但错误百出。 现在想知道:能否按元素访问html内容,比如javascript里面可以用document.all("MainTable").(…)这样的方法来访问。)
<?php
$html1 = '
<html>
<head></head>
<body>
<table name="MainTable" bgcolor="#CCCCCC" width="100%" border="0" cellpadding="0" cellspacing="1">
<tr>
<td class="subtitle" rowspan=2>方向</td>
<td class="subtitle" colspan=2>输入</td>
<td class="subtitle" colspan=2>滤后</td>
<td class="subtitle" rowspan=2>其它</td>
</tr>
<tr>
<td class="subtitle">流量</td>
<td class="subtitle">报文</td>
<td class="subtitle">流量</td>
<td class="subtitle">报文</td>
</tr>
<tr>
<td width="20%">外网接口</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">3 pps</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">0 pps</td>
<td width="20%" rowspan=2 style="text-align:left;padding-left:20px">
伪造地址 0.00 Mbps<br>
路由丢失 0.00 Mbps
</td>
</tr>
<tr>
<td width="20%">内网接口</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">1 pps</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">0 pps</td>
</tr>
</table>
</body>
</html>
';
$html2 = '
<html>
<head></head>
<body>
<table name="MainTable" bgcolor="#CCCCCC" width="100%" border="0" cellpadding="0" cellspacing="1">
<tr>
<td class="subtitle" rowspan=2>方向</td>
<td class="subtitle" colspan=2>输入</td>
<td class="subtitle" colspan=2>滤后</td>
<td class="subtitle" rowspan=2>其它</td>
</tr>
<tr>
<td class="subtitle">流量</td>
<td class="subtitle">报文</td>
<td class="subtitle">流量</td>
<td class="subtitle">报文</td>
</tr>
<tr>
<td width="20%">外网接口</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">3 pps</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">0 pps</td>
<td width="20%" rowspan=2 style="text-align:left;padding-left:20px">
伪造地址 0.00 Mbps<br>
路由丢失 0.00 Mbps
</td>
</tr>
<tr>
<td width="20%">内网接口</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">1 pps</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">0 pps</td>
</tr>
</table>
</body>
</html>
';$list1 = -1;
preg_match_all("/(\d+(\.\d+)*)\s+(Mbps|pps)/i", $html1, $match1);
echo preg_replace_callback("/(\d+(\.\d+)*)\s+(Mbps|pps)/i", 'cb', $html2);function cb($matchs){
global $match1, $list1;
$list1 ++;
return ($matchs[1] + $match1[1][$list1]).' '.$matchs[3];
}
?>
<html>
<head></head>
<body>
<table name="MainTable" bgcolor="#CCCCCC" width="100%" border="0" cellpadding="0" cellspacing="1">
<tr>
<td class="subtitle" rowspan=2>方向 </td>
<td class="subtitle" colspan=2>输入 </td>
<td class="subtitle" colspan=2>滤后 </td>
<td class="subtitle" rowspan=2>其它 </td>
</tr>
<tr>
<td class="subtitle">流量 </td>
<td class="subtitle">报文 </td>
<td class="subtitle">流量 </td>
<td class="subtitle">报文 </td>
</tr>
<tr>
<td width="20%">外网接口 </td>
<td width="15%">0.00 Mbps</td>
<td width="15%">3 pps</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">0 pps</td>
<td width="20%" rowspan=2 style="text-align:left;padding-left:20px">
伪造地址 0.00 Mbps<br>
路由丢失 0.00 Mbps
</td>
</tr>
<tr>
<td width="20%">内网接口</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">1 pps</td>
<td width="15%">0.00 Mbps</td>
<td width="15%">0 pps</td>
</tr>
</table>
</body>
</html>
STR;
$dom = new DOMDocument();
$dom->loadHTML( $str );
$xpath = new DOMXPath( $dom );
$el = $xpath->query("//html/body/table[@name='MainTable']/tr[position()=3]/td[position()=3]");
foreach ($el as $k=>$v)
{
echo $v->nodeName."<br/>"; //td
echo $v->getAttribute('width')."<br/>"; // 30%
echo $v->nodeValue;//3 pps
}
如果抓取到的内容data
把data innerHTML到一个隐藏div
再用js获取table的列,累加某列,这样就算他css什么有改变只要列数固定就可以。