【问题标题】:How to create a sitemap with page relationships如何创建具有页面关系的站点地图
【发布时间】:2012-05-10 19:33:23
【问题描述】:

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

示例页面

A
B
C
D

我希望输出给我类似以下的内容。

页面名称: A

链接到页面 A 的页面:

  • B
  • C
  • D

页面名称: B

链接到页面 B 的页面:

  • 一个
  • C

等等……

我遇到了多个标准站点地图脚本,但没有一个能真正实现我所寻找的。​​p>


编辑 看来我没有提供足够的信息。对不起,我在那里不够清楚。这是我目前拥有的代码。我使用 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;

?>

注意:我的小 foreach 循环只是根据 url 中的特定子字符串进行过滤。

所以,我有必要的第一级页面。我陷入困境的是创建一个不会无限期运行的循环,同时跟踪您已经访问过的页面。

【问题讨论】:

  • 我已经更新了我的帖子,详细说明了需要什么。
  • 感谢您的更新,安迪。这是我们可以合作的东西:) 请记得投票/接受对您有帮助的答案。

标签: php arrays loops sitemap


【解决方案1】:

基本上,您需要两个数组来控制这里的流程。第一个将跟踪您需要查看的页面,第二个将跟踪您已经查看过的页面。然后,您只需在每个页面上运行现有代码,直到没有剩余代码:

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

?>

【讨论】:

  • 感谢您的回复。看到你写这篇文章的方式对我来说绝对有意义,但在实践中,由于某种原因,我遇到了一个致命错误。我试图找出原因,但也许你会知道。 致命错误:嵌套级别太深 - 递归依赖? for line if((!in_array($link, $urlsToCheck)) &amp;&amp; (!in_array($link,$urlsChecked))): 更新:我发现了问题。 in_array 是使用对象而不是我需要的特定值来完成的。
  • 这可能有点过度使用数组,因为$link 本身也是一个数组。您可以尝试用$link-&gt;href 替换几乎所有$link 实例(实际foreach() 除外)声明
猜你喜欢
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多