通过 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.'
';
我使用 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>
元素,而您感兴趣的(我认为)是具有 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.'
';