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").(…)这样的方法来访问。)

解决方案 »

  1.   

    curl只能取到页面元素,是不能运行js的xml和json都可以,xml可以用 simplexml_load_string 函数,只要按xml格式规范都可以正常解析建议使用json
      

  2.   

    你是想取页面中的部分的html元素?可以考虑用js来做
      

  3.   

    获取之后再php抓取后的字符串里面运行js
      

  4.   


    <?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];
    }
    ?>
      

  5.   

    这么规整的html.用xpath正合适,LZ不妨多多了解下xpath语法$str = <<<STR
    <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
    }
      

  6.   

    可以用js实现,如果结合jquery更好。
    如果抓取到的内容data
    把data innerHTML到一个隐藏div
    再用js获取table的列,累加某列,这样就算他css什么有改变只要列数固定就可以。
      

  7.   

    一类网页是可以的,但很少有通用的方法一般三类:字串截取,正则和DOm,xpath没用过