DOM Parser захватывает href тега <a> по классу = «Решение»

0

Я работаю с парсером DOM, и у меня возникают проблемы. Я в основном пытаюсь захватить href внутри тега, который содержит только идентификатор класса "thumbnail". Я пытаюсь распечатать ссылки на экране и не получаю никаких результатов. Любая помощь приветствуется. Я также включил error_reporting (E_ALL); и все еще ничего.

$html = file_get_contents('http://www.reddit.com/r/funny');
$dom = new DOMDocument();
@$dom->loadHTML($html);
$classId = "thumbnail ";
$div = $html->find('a#'.$classId);
echo $div;

Я также пробовал это, но все же имел тот же результат НИЧЕГО:

include('simple_html_dom.php');
$html = file_get_contents('http://www.reddit.com/r/funny');
$dom = new DOMDocument();
@$dom->loadHTML($html);
// grab all the on the page
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");
$ret = $html->find('a[class=thumbnail]');
echo $ret;
  • 2
    $html - это строка, а не объект, поэтому вы никогда не сможете использовать $html-> . Вы смешиваете DOMDocument и анализатор Simple HTML DOM.
  • 0
    Я думал, когда я перезагружал его в DOM, это был объект, а не строка? Поправьте меня если я ошибаюсь?
Показать ещё 3 комментария
Теги:
dom
parsing

4 ответа

1
Лучший ответ

Этот код, вероятно, будет работать:

$html = file_get_contents('http://www.reddit.com/r/funny');
$dom = new DOMDocument();
@$dom->loadHTML($html);

$xpath = new DOMXPath($dom);
$hyperlinks = $xpath->query('//a[@class="thumbnail"]');

foreach($hyperlinks as $hyperlink) {
   echo $hyperlink->getAttribute('href'), '<br>;'
}
  • 1
    Хм, я всегда использую contains(concat(' ',@class,' '),' thumbnail ') для проверки, есть ли у чего-то класс, но, возможно, также и другие имена классов.
  • 1
    ПОБЕДИТЕЛЬ ПОБЕДИТЕЛЬ КУРИНЫЙ УЖИН! Большое вам спасибо!
Показать ещё 3 комментария
3

Вы были почти там:

<?php
$dom = new DOMDocument();
@$dom->loadHTMLFile('http://www.reddit.com/r/funny');

$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a[contains(concat(' ',normalize-space(@class),' '),' thumbnail ')]");
var_dump($hrefs);

дает:

class DOMNodeList#28 (1) {
  public $length =>
  int(25)
}

25 матчей, я бы назвал это успехом.

  • 1
    Можно пропустить одну строку, используя $dom->loadHTMLFile($url)
  • 1
    @Phil: должным образом отмечено. Я собирался сделать «наименьшее количество изменений в исходном коде», но мы можем также внести это туда, я его отредактирую.
0

если вы используете simple_html_dom, почему вы делаете все эти лишние вещи? Он уже обертывает ресурс во всем, что вам нужно - http://simplehtmldom.sourceforge.net/manual.htm

include('simple_html_dom.php');

// set up:
$html = new simple_html_dom();

// load from URL:
$html->load_file('http://www.reddit.com/r/funny');

// find those <a> elements:
$links = $html->find('a[class=thumbnail]');

// done.
echo $links;
0

Протестировали его и внесли некоторые изменения - это тоже отлично.

<?php
    // load the url and set up an array for the links
    $dom = new DOMDocument();
    @$dom->loadHTMLFile('http://www.reddit.com/r/funny');
    $links = array();

    // loop thru all the A elements found
    foreach($dom->getElementsByTagName('a') as $link) {
        $url = $link->getAttribute('href');
        $class = $link->getAttribute('class');

        // Check if the URL is not empty and if the class contains thumbnail
        if(!empty($url) && strpos($class,'thumbnail') !== false) {
            array_push($links, $url);
        }
    }

    // Print results
    print_r($links);
?>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню