Простой HTML DOM, рекурсивный поиск ссылок

Я использую простой html dom для поиска ссылок на определенной странице, используя:

// Find all links
foreach($html->find('a') as $element)
       echo $element->href . '<br>'; 

Это находит все ссылки на странице, однако я хочу также иметь возможность переходить к найденным ссылкам и находить ссылки внутри этих найденных ссылок рекурсивно, например, до уровня 5.

Любая идея о том, как идти?


person Sarfraz    schedule 02.02.2011    source источник
comment
Каков был бы ваш желаемый результат, поскольку приведенное выше нашло бы ссылки внутри ссылок?   -  person RobertPitt    schedule 02.02.2011
comment
@Robert: Да, ссылки внутри ссылок рекурсивно.   -  person Sarfraz    schedule 02.02.2011


Ответы (2)


Используйте рекурсивную функцию и следите за глубиной:

function findLinks($url, $depth, $maxDepth) {
  // fetch $url and parse it
  // ...
  if ($depth <= $maxDepth)
    foreach($html->find('a') as $element)
      findLinks($element->href, $depth + 1, $maxDepth);
}

И вы бы начали с вызова чего-то вроде findLinks($rootUrl, 1, 5).

person casablanca    schedule 02.02.2011
comment
Да, я тоже изо всех сил пытаюсь понять логику этого. - person RobertPitt; 02.02.2011
comment
@Murilo: Хотите прочитать прокомментированную строку? Вам нужно получить $url самостоятельно — я понятия не имею, откуда вы берете файл. - person casablanca; 02.02.2011
comment
Это будут рекурсивные страницы, а не рекурсивные элементы на одной странице. У него есть 1 страница, и я полагаю, что он хочет получить все ссылки и глубину внутри DOM. - person RobertPitt; 02.02.2011
comment
@RobertPitt: Это не имеет никакого смысла - у вас не может быть ссылок внутри ссылок на действительной HTML-странице. - person casablanca; 02.02.2011
comment
@casablanca: я имел в виду, когда вы нашли ссылки на странице, я должен иметь возможность посетить найденные ссылки, а затем найти другие ссылки внутри них и так далее. Хотя ваш код имеет смысл. - person Sarfraz; 02.02.2011
comment
@casablanca, мои извинения за недоразумение, вы абсолютно правы, и я неправильно истолковал исходный вопрос. +1 - person RobertPitt; 02.02.2011

Раньше мне нужна была подобная функция. Что вы можете сделать, так это использовать mysql для хранения ваших ссылок.

В моем случае у меня была таблица todo и таблица pages. Добавьте в таблицу todo несколько URL-адресов, которые вы хотите найти.

Раньше я получал необходимую мне информацию о странице (открытый текст и заголовок) и сохранял ее в базе данных mysql db pages. Затем я перебирал ссылки и добавлял их в таблицу todo. Последним шагом было удалить текущую страницу из моего списка задач, а затем выполнить цикл.

grab a url from todo loop 
{ 
   get current page title and plaintext store it in pages table
   loop through links Add found links to todo table
   remove current page from todo 
}
person Mack    schedule 19.03.2013