2012-05-10 123 views
2

我目前正试图找出一种方法来编写一个脚本(最好是PHP),该脚本将通过站点爬行并创建站点地图。除了传统的页面标准列表之外,我希望脚本能够跟踪哪些页面链接到其他页面。如何使用页面关系创建站点地图

示例页面

A 
B 
C 
D 

我想输出给我像下面这样。

页面名称:

页链接到网页A:

  • Ç
  • d

页面名称:

页面链接到网页B:

  • 一个
  • Ç

等等

我已经遇到多个标准Sitemap脚本,但没有什么能够真正实现我所寻找的。


编辑 我似乎没有给足够的信息。对不起,我缺乏清晰度。这是我现在的代码。我使用simple_html_dom.php来处理解析和搜索html的任务。

<?php 

include("simple_html_dom.php"); 

url = 'page_url'; 

$html = new simple_html_dom(); 
$html->load_file($url); 

$linkmap = array(); 

foreach($html->find('a') as $link): 
    if(contains("cms/education",$link)): 
     if(!in_array($link, $linkmap)): 
      $linkmap[$link->href] = array(); 
     endif; 
    endif; 
endforeach; 

?> 

注:基于URL特定的子我的小foreach循环过滤器只。

所以,我有必要的第一级页面。卡住的地方在于创建一个不会无限期运行的循环,同时跟踪您已经访问过的页面。

+0

那么你的问题是什么? – Gumbo

+0

我已经更新了我的帖子,并提供了更多详细信息。 – Andy

+1

感谢您的更新,安迪。这是我们可以与之合作的事情:)请记住点赞/接受可以帮助你的答案。 –

回答

0

基本上,您需要两个数组来控制流量。第一个将跟踪您需要查看的页面,第二个将跟踪您已查看的页面。然后你只需在每一页上运行你现有的代码,直到没有遗漏:

<?php 

include("simple_html_dom.php"); 

$urlsToCheck = array(); 
$urlsToCheck[] = 'page_url'; 
$urlsChecked = array(); 

while(count($urlsToCheck) > 0) 
{ 
    $url = array_pop($urlsToCheck); 
    if (!in_array($url, $urlsChecked) 
    { 
     $urlsChecked[] = $url; 

     $html = new simple_html_dom(); 
     $html->load_file($url); 

     $linkmap = array(); 

     foreach($html->find('a') as $link): 
      if(contains("cms/education",$link)): 
       if((!in_array($link, $urlsToCheck)) && (!in_array($link,$urlsChecked))) 
       $urlsToCheck[] = $link; 

       if(!in_array($link, $linkmap)): 
        $linkmap[$link->href] = array(); 
       endif; 
      endif; 
     endforeach; 
    } 
} 

?> 
+0

感谢您的回复。看到你写这个的方式对我来说肯定是有道理的,但是实际上由于某种原因我得到了一个致命的错误。我试图找出原因,但也许你会知道你的头脑。 **致命错误:嵌套级别太深 - 递归依赖性**线路 '如果:'((in_array($连接,$ urlsToCheck))&&(in_array($连接,$ urlsChecked))!) 更新:我发现这个问题。 in_array正在使用该对象来完成,而不是我需要的特定值。 – Andy

+0

它可能会超出数组的范围,因为'$ link'本身也是一个数组。你可以尝试用'$ link-> href'替换几乎所有'$ link'的实例(除了在实际的'foreach()')声明中。 –