通过 DOMDocument 获取 link 标签

Getting link tag via DOMDocument

我使用 atom2rss.xsl 将原子提要转换为 RSS。工作良好。

然后,使用 DOMDocument,我尝试获取 post 标题和 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;
}

但是 post URL 是空的。

看到这个 eval which contains HTML。我究竟做错了什么?我怀疑我没有通过 $item->getElementsByTagName("link")->item(0)->nodeValue.

正确获取 link 标签

我认为问题在于每个项目中有几个 <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
   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.'
    ';