Как построить рекурсивную функцию?

Задача:
На первой странице отлавливать все ссылки типа "//a[@class='foo']". Далее необходимо перейти по каждой из них и снова спарсить ссылки "//a[@class='foo']" и т.д, до тех пор, пока "//a[@class='foo']" существует.

$dom = new DOMDocument();
$dom->loadHTMLFile($url);
$xpath = new DOMXpath($dom);
$pattern = "//a[@class='foo']";

if ($xpath->query($pattern)->length == 0) {
}
else{
	foreach($xpath->query($pattern) as $cat) {
	    echo  $cat->nodeValue . " " . $cat->getAttribute("href") . "\n";
    }
}


Я так понимаю что нужно построить рекурсивную функцию, но это у меня не получается.
  • Вопрос задан
  • 2571 просмотр
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Введите очередь ссылок. Как только обработали страницу, добавьте в очередь все следующие ссылки. В цикле считывайте ссылки, загружайте и парсите их и так пока очередь не закончится. Никаких рекурсий тут не нужно.

Так же как дополнительный профит можно выбирать из очереди по несколько ссылок и использовать multi curl что бы скачивать документы в несколько потоков.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
jakulov
@jakulov
Чтобы понять рекурсию, нужно понять рекурсию
function parse_recursive($url) {
 $dom = new DOMDocument();
 $dom->loadHTMLFile($url); 
 $xpath = new DOMXpath($dom); 
 $pattern = "//a[@class='foo']";
 if ($xpath->query($pattern)->length == 0) {
   return;
 }
 else{
     foreach($xpath->query($pattern) as $cat) {
	 parse_recursive($cat->getAttribute("href"));
     }
 }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы