Abrufen von Titel- und Meta-Tags von einer externen Website

Lesezeit: 6 Minuten

Abrufen von Titel und Meta Tags von einer externen Website
MacMac

Ich möchte versuchen, herauszufinden, wie man die bekommt

<title>A common title</title>
<meta name="keywords" content="Keywords blabla" />
<meta name="description" content="This is the description" />

Obwohl es in beliebiger Reihenfolge angeordnet ist, habe ich vom PHP Simple HTML DOM Parser gehört, aber ich möchte es nicht wirklich verwenden. Ist eine Lösung möglich, außer den PHP Simple HTML DOM Parser zu verwenden?

preg_match nicht in der Lage sein, es zu tun, wenn es ungültiges HTML ist?

Kann cURL so etwas mit preg_match machen?

Facebook macht so etwas, aber es wird richtig verwendet, indem es Folgendes verwendet:

<meta property="og:description" content="Description blabla" />

Ich möchte so etwas, damit es möglich ist, wenn jemand einen Link postet, es sollte den Titel und die Meta-Tags abrufen. Wenn keine Meta-Tags vorhanden sind, werden sie ignoriert oder der Benutzer kann sie selbst festlegen (aber das mache ich später selbst).

So soll es sein:

function file_get_contents_curl($url)
{
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

    $data = curl_exec($ch);
    curl_close($ch);

    return $data;
}

$html = file_get_contents_curl("http://example.com/");

//parsing begins here:
$doc = new DOMDocument();
@$doc->loadHTML($html);
$nodes = $doc->getElementsByTagName('title');

//get and display what you need:
$title = $nodes->item(0)->nodeValue;

$metas = $doc->getElementsByTagName('meta');

for ($i = 0; $i < $metas->length; $i++)
{
    $meta = $metas->item($i);
    if($meta->getAttribute('name') == 'description')
        $description = $meta->getAttribute('content');
    if($meta->getAttribute('name') == 'keywords')
        $keywords = $meta->getAttribute('content');
}

echo "Title: $title". '<br/><br/>';
echo "Description: $description". '<br/><br/>';
echo "Keywords: $keywords";

  • Zwei Jahre später und immer noch einwandfrei funktioniert, änderte man die Attribute um das zu bekommen og: Tags im Zusammenhang mit OpenGraph und funktioniert einwandfrei

    – Jaroslaw

    19. Oktober 2012 um 10:37 Uhr

  • Fantastisch! Danke Shamittomar. Addieren strtolower um herum $meta->getAttribute()!! Manchmal haben sie ein Kapitell an der Vorderseite

    Benutzer993683

    4. Juli 2013 um 14:09 Uhr


  • @shamittomar würde es Ihnen etwas ausmachen, ein Beispiel auf Codepad oder Pastebin zu zeigen, wie dieser Code geändert werden kann, wenn sich die URLs in einem Array befinden.

    – Anagio

    2. September 2013 um 23:00 Uhr

  • Funktioniert großartig, aber in meinem Fall hat es für einige URLs nicht funktioniert. Nach dem Debuggen habe ich festgestellt, dass $nodes = $doc->getElementsByTagName('title'); gibt die Länge der Ergebnisse zurück und wenn der Titel fehlt, wird eine Warnung ausgegeben. Ersetzen Sie also einfach die nächste Zeile, dh $title = $nodes->item(0)->nodeValue; durch if ($nodes->length>0) { $title = $nodes->item(0)->nodeValue; }

    – Penny

    26. Mai 2015 um 2:51 Uhr

  • warum curl und nicht nur file_get_contents ?

    – TarranJones

    7. Juni 2015 um 9:35 Uhr

Abrufen von Titel und Meta Tags von einer externen Website
Bob Jeey

<?php
// Assuming the above tags are at www.example.com
$tags = get_meta_tags('http://www.example.com/');

// Notice how the keys are all lowercase now, and
// how . was replaced by _ in the key.
echo $tags['author'];       // name
echo $tags['keywords'];     // php documentation
echo $tags['description'];  // a php manual
echo $tags['geo_position']; // 49.33;-86.59
?>

  • Dies liefert jedoch nicht den Seitentitel

    – Stahlgehirn

    28. September 2014 um 18:39 Uhr

  • ^ weil es sich um eine Funktion handelt, die sich auf Meta-Tags bezieht, wie um alles in der Welt soll sie etwas zurückgeben – sie ist nicht betroffen.

    – Nishant Ghodke

    6. Oktober 2015 um 19:27 Uhr

  • Hey zusammen, habt ihr eine Idee, warum dieses Beispiel nicht mit einer öffentlichen Fanseite von Facebook funktioniert? Ich kann die Meta-Tags von keiner Facebook-Seite lesen. Beispiel: facebook.com/MeineNanny wenn ich mich erkundige metatags.io Ich kann die Meta-Beschreibung sehen, wenn ich versuche, mit PHP zu lesen, kann ich sie nicht bekommen! Ideen?

    – Mitsch

    6. Januar 2021 um 22:21 Uhr


Abrufen von Titel und Meta Tags von einer externen Website
Lloyd Moore

get_meta_tags wird Ihnen mit allem außer dem Titel helfen. Um den Titel zu erhalten, verwenden Sie einfach eine Regex.

$url="http://some.url.com";
preg_match("/<title>(.+)<\/title>/siU", file_get_contents($url), $matches);
$title = $matches[1];

Ich hoffe, das hilft.

1646639049 326 Abrufen von Titel und Meta Tags von einer externen Website
Harald

get_meta_tags hat mit dem Titel nicht funktioniert.

Nur Meta-Tags mit Namensattributen wie

<meta name="description" content="the description">

wird geparst.

PHPs native Funktion: get_meta_tags()

http://php.net/manual/en/function.get-meta-tags.php

Leider erfordert die eingebaute PHP-Funktion get_meta_tags() den Namensparameter, und bestimmte Websites, wie z. B. Twitter, lassen dies zugunsten des Eigenschaftsattributs weg. Diese Funktion, die eine Mischung aus Regex und Dom-Dokument verwendet, gibt ein verschlüsseltes Array von Metatags von einer Webseite zurück. Es sucht nach dem Namensparameter und dann nach dem Eigenschaftsparameter. Dies wurde auf Instagram, Pinterest und Twitter getestet.

/**
 * Extract metatags from a webpage
 */
function extract_tags_from_url($url) {
  $tags = array();

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

  $contents = curl_exec($ch);
  curl_close($ch);

  if (empty($contents)) {
    return $tags;
  }

  if (preg_match_all('/<meta([^>]+)content="([^>]+)>/', $contents, $matches)) {
    $doc = new DOMDocument();
    $doc->loadHTML('<?xml encoding="utf-8" ?>' . implode($matches[0]));
    $tags = array();
    foreach($doc->getElementsByTagName('meta') as $metaTag) {
      if($metaTag->getAttribute('name') != "") {
        $tags[$metaTag->getAttribute('name')] = $metaTag->getAttribute('content');
      }
      elseif ($metaTag->getAttribute('property') != "") {
        $tags[$metaTag->getAttribute('property')] = $metaTag->getAttribute('content');
      }
    }
  }

  return $tags;
}

Sollten wir nicht OG verwenden?

Die gewählte Antwort ist gut, funktioniert aber nicht, wenn eine Site ist umgeleitet (sehr häufig!) und kehrt nicht zurück OG-Tagswelche sind der neue Industriestandard. Hier ist eine kleine Funktion, die 2018 etwas benutzerfreundlicher ist. Sie versucht, OG-Tags zu erhalten, und greift auf Meta-Tags zurück, wenn sie diese nicht erreichen:

function getSiteOG( $url, $specificTags=0 ){
    $doc = new DOMDocument();
    @$doc->loadHTML(file_get_contents($url));
    $res['title'] = $doc->getElementsByTagName('title')->item(0)->nodeValue;

    foreach ($doc->getElementsByTagName('meta') as $m){
        $tag = $m->getAttribute('name') ?: $m->getAttribute('property');
        if(in_array($tag,['description','keywords']) || strpos($tag,'og:')===0) $res[str_replace('og:','',$tag)] = $m->getAttribute('content');
    }
    return $specificTags? array_intersect_key( $res, array_flip($specificTags) ) : $res;
}

Wie man es benutzt:

/////////////
//SAMPLE USAGE:
print_r(getSiteOG("http://www.stackoverflow.com")); //note the incorrect url

/////////////
//OUTPUT:
Array
(
    Getting title and meta tags from external website => Stack Overflow - Where Developers Learn, Share, & Build Careers
    Getting title and meta tags from external website => Stack Overflow is the largest, most trusted online community for developers to learn, shareâ âtheir programming âknowledge, and build their careers.
    [type] => website
    [url] => https://stackoverflow.com/
    [site_name] => Stack Overflow
    [image] => https://cdn.sstatic.net/Sites/stackoverflow/img/[email protected]?v=73d79a89bded
)

964080cookie-checkAbrufen von Titel- und Meta-Tags von einer externen Website

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy