小问题,100分-_-

sunlin7 2010-06-03 12:03:53
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").(…)这样的方法来访问。)
...全文
211 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lukylfm 2010-06-05
  • 打赏
  • 举报
回复
学习了
我一般用preg_match_all
床上等您 2010-06-05
  • 打赏
  • 举报
回复
一直在用 正则
sunlin7 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jianye112 的回复:]
PHP code

<?php
$html1 = '
<html>
<head></head>
<body>
<table name="MainTable" bgcolor="#CCCCCC" width="100%" border="0" cellpadding="0" cellspacing="1">
<tr>
……
[/Quote]

真是神人啊,好利害!!!
北京不不 2010-06-04
  • 打赏
  • 举报
回复
可以用js实现,如果结合jquery更好。
如果抓取到的内容data
把data innerHTML到一个隐藏div
再用js获取table的列,累加某列,这样就算他css什么有改变只要列数固定就可以。



Dleno 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 foolbirdflyfirst 的回复:]
这么规整的html.用xpath正合适,LZ不妨多多了解下xpath语法


PHP code
$str = <<<STR
<html>
<head></head>
<body>
<table name="MainTable" bgcolor="#CCCCCC" width="100%" border="0" cellpadding="0" cellspacing=……
[/Quote]

又学习了!
zongmekeneng 2010-06-04
  • 打赏
  • 举报
回复
学习ing……
blue44sky 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jianye112 的回复:]
PHP code

<?php
$html1 = '
<html>
<head></head>
<body>
<table name="MainTable" bgcolor="#CCCCCC" width="100%" border="0" cellpadding="0" cellspacing="1">
<tr>
……
[/Quote]
学习
fxs_2008 2010-06-04
  • 打赏
  • 举报
回复
一类网页是可以的,但很少有通用的方法

一般三类:字串截取,正则和DOm,

xpath没用过



ruanchao 2010-06-03
  • 打赏
  • 举报
回复
你是想取页面中的部分的html元素?可以考虑用js来做
sunlin7 2010-06-03
  • 打赏
  • 举报
回复
比如说我两次得到上面给出的表格(里面的数字不一样),如何将两个表格里面的数字加起来并生成这样格式的汇总表格?谢谢
sindel 2010-06-03
  • 打赏
  • 举报
回复
curl只能取到页面元素,是不能运行js的

xml和json都可以,xml可以用 simplexml_load_string 函数,只要按xml格式规范都可以正常解析

建议使用json
jusin2y 2010-06-03
  • 打赏
  • 举报
回复
拿点分...
sunlin7 2010-06-03
  • 打赏
  • 举报
回复
7楼果然牛人啊,膜拜一下,呵呵
foolbirdflyfirst 2010-06-03
  • 打赏
  • 举报
回复
这么规整的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
}
z109876543210 2010-06-03
  • 打赏
  • 举报
回复

<?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];
}
?>
loveenglish 2010-06-03
  • 打赏
  • 举报
回复
抓取后用正则表达式匹配要抓取的部分
kyzy_yy_pm 2010-06-03
  • 打赏
  • 举报
回复
获取之后再php抓取后的字符串里面运行js

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧