Получение тега ссылки через DOMDocument - PullRequest
0 голосов
/ 10 сентября 2018

Я конвертирую атомную ленту в RSS используя atom2rss.xsl . Работает отлично.

Затем, используя DOMDocument , я пытаюсь получить заголовок сообщения и URL:

$feed = new DOMDocument();
$feed->loadHTML('<?xml encoding="utf-8" ?>' . $html);

if (!empty($feed) && is_object($feed) ) {
    foreach ($feed->getElementsByTagName("item") as $item){
        echo 'url: '. $item->getElementsByTagName("link")->item(0)->nodeValue;
        echo 'title'. $item->getElementsByTagName("title")->item(0)->nodeValue;
    }
    return;
}

Но URL поста пуст.

См. eval, который содержит HTML . Что я делаю неправильно? Я подозреваю, что неправильно получаю тег ссылки через $item->getElementsByTagName("link")->item(0)->nodeValue.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018
   function get_links($link)
    {
        $ret = array();
        $dom = new DOMDocument();
        @$dom->loadHTML(file_get_contents($link));
        $dom->preserveWhiteSpace = false;
        $links = $dom->getElementsByTagName('a');
        foreach ($links as $tag){
            $ret[$tag->getAttribute('href')] = $tag->childNodes->item(0)->nodeValue;
        }

        return $ret;
    }
  print_r(get_links('http://www.google.com')); 

ИЛИ вы можете использовать DOMXpath

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

    // take all links
    $xpath = new DOMXPath($dom);
    $hrefs = $xpath->evaluate("/html/body//a");

    for ($i = 0; $i < $hrefs->length; $i++) {
           $href = $hrefs->item($i);
           $url = $href->getAttribute('href');
           echo $url.'
    ';
0 голосов
/ 10 сентября 2018

Я думаю, проблема в том, что в каждом элементе есть несколько <link> элементов, и один (я думаю), который вас интересует, - это элемент с rel="self" в качестве атрибута. Самый быстрый способ (не возиться с XPath) - это циклически проходить каждый элемент <link>, проверяя правильное значение rel, а затем извлекать атрибут href из этого ...

if (!empty($feed) && is_object($feed) ) {
    foreach ($feed->getElementsByTagName("item") as $item){
        $url = "";
        // Look for the 'right' link tag and extract URL from that
        foreach ( $item->getElementsByTagName("link") as $link )    {
            if ( $link->getAttribute("rel") == "self" ) {
                $url = $link->getAttribute("href");
                break;
            }
        }
        echo 'url: '. $url;
        echo 'title'. $item->getElementsByTagName("title")->item(0)->nodeValue;
    }
    return;
}

, что дает ...

url: https://www.blogger.com/feeds/2984353310628523257/posts/default/1947782625877709813titleExtraordinary Genius - Cp274
...