Поиск и печать всех ссылок в DIV - PullRequest
1 голос
/ 01 июня 2010

Я пытаюсь найти все ссылки в div, а затем печатаю эти ссылки.

Я использую Simple HTML Dom для анализа HTML-файла. Вот что у меня есть, прочитайте встроенные комментарии и дайте мне знать, где я ошибаюсь.

include('simple_html_dom.php');  

$html = file_get_html('tester.html');

$articles = array();

//find the div the div with the id abcde
foreach($html->find('#abcde') as $article) {

    //find all a tags that have a href in the div abcde
    foreach($article->find('a[href]') as $link){

        //if the href contains singer then echo this link
        if(strstr($link, 'singer')){

            echo $link;

        }

    }

}

В настоящее время происходит то, что вышеприведенное требует много времени для загрузки (так и не завершилось). Я напечатал, что он делал в каждом цикле, так как ждать было слишком долго, и я обнаружил, что он проходит через то, что мне не нужно! Это говорит о том, что мой код неверен.

HTML-код примерно такой:

<div id="abcde">
<!-- lots of html elements -->
<!-- lots of a tags -->
<a href="singer/tom" />
<img src="image..jpg" />
</a>
</div>

Спасибо всем за помощь

Ответы [ 2 ]

3 голосов
/ 01 июня 2010

Правильный способ выбора div (или любого другого) по идентификатору с использованием этого API:

$html->find('div[id=abcde]');

Кроме того, поскольку идентификаторы должны быть уникальными, следующего должно быть достаточно:

//find all a tags that have a href in the div abcde
$article = $html->find('div[id=abcde]', 0);

foreach($article->find('a[href]') as $link){

    //if the href contains singer then echo this link
    if(strstr($link, 'singer')){
        echo $link;
    }
}
0 голосов
/ 01 июня 2010

Почему бы вам не использовать вместо этого встроенное расширение DOM?

<?php

$cont = file_get_contents("http://stackoverflow.com/") or die("1");

$doc = new DOMDocument();
@$doc->loadHTML($cont) or die("2");

$nodes = $doc->getElementsByTagName("a");

for ($i = 0; $i < $nodes->length; $i++) {
    $el = $nodes->item($i);
    if ($el->hasAttribute("href"))
        echo "- {$el->getAttribute("href")}\n";
}

дает

... (lots of links before) ...
- http://careers.stackoverflow.com
- http://serverfault.com
- http://superuser.com
- http://meta.stackoverflow.com
- http://www.howtogeek.com
- http://doctype.com
- http://creativecommons.org/licenses/by-sa/2.5/
- http://www.peakinternet.com/business/hosting/colocation-dedicated#
- http://creativecommons.org/licenses/by-sa/2.5/
- http://blog.stackoverflow.com/2009/06/attribution-required/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...