wake-up-neo.net

Titel- und Metatags von externer Website abrufen

Ich möchte versuchen herauszufinden, wie man das 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 einfachen HTML-DOM-Parser PHP gehört, möchte ihn aber nicht wirklich verwenden. Ist es möglich, eine Lösung zu verwenden, außer den Simple HTML DOM Parser PHP. 

preg_match kann dies nicht, 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 verwendet:

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

Ich möchte so etwas, dass es möglich ist, wenn jemand einen Link veröffentlicht, der Titel und die Meta-Tags abgerufen werden sollen. Wenn es keine Meta-Tags gibt, dann werden es ignoriert oder der Benutzer kann es selbst festlegen (aber ich mache das später selbst).

51
MacMac

So sollte 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";
151
shamittomar
<?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
?>
34
Bob Jeey

get_meta_tags hilft Ihnen bei allen außer dem Titel. Um den Titel zu erhalten, verwenden Sie einfach einen Regex.

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

Hoffentlich hilft das.

8
Lloyd Moore

Php native Funktion: Get_meta_tags ()

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

6
Nitroware

get_meta_tags hat nicht mit title gearbeitet.

Nur Meta-Tags mit Namensattributen wie 

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

wird analysiert.

4
Harald

Leider ist für die eingebaute PHP-Funktion get_meta_tags () der name-Parameter erforderlich, und bestimmte Websites wie Twitter lassen dies für das property-Attribut aus. Diese Funktion verwendet eine Mischung aus Regex und Dom-Dokument und gibt ein Array von Metatags mit Schlüsseln von einer Webseite zurück. Es wird nach dem Namensparameter und dann nach dem Eigenschaftsparameter gesucht. Dies wurde auf instragram, 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;
}
4
oknate

Ihre beste Wette ist, die Kugel mit dem DOM-Parser zu beißen. Auf lange Sicht sparen Sie mehr Zeit als nötig, um zu lernen, wie. Das Analysieren von HTML mit Regex ist bekanntermaßen in bestimmten Fällen unzuverlässig und intolerant. 

4
Joshua

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

<?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
?>   
3
afro360

Wir verwenden Apache Tika über php (Befehlszeilen-Dienstprogramm) mit -j für json:

http://tika.Apache.org/

<?php
    Shell_exec( 'Java -jar tika-app-1.4.jar -j http://www.guardian.co.uk/politics/2013/jul/21/tory-strategist-lynton-crosby-lobbying' );
?>

Dies ist ein Beispiel output aus einem Artikel mit zufälligem Vormund:

{
   "Content-Encoding":"UTF-8",
   "Content-Length":205599,
   "Content-Type":"text/html; charset\u003dUTF-8",
   "DC.date.issued":"2013-07-21",
   "X-UA-Compatible":"IE\u003dEdge,chrome\u003d1",
   "application-name":"The Guardian",
   "article:author":"http://www.guardian.co.uk/profile/nicholaswatt",
   "article:modified_time":"2013-07-21T22:42:21+01:00",
   "article:published_time":"2013-07-21T22:00:03+01:00",
   "article:section":"Politics",
   "article:tag":[
      "Lynton Crosby",
      "Health policy",
      "NHS",
      "Health",
      "Healthcare industry",
      "Society",
      "Public services policy",
      "Lobbying",
      "Conservatives",
      "David Cameron",
      "Politics",
      "UK news",
      "Business"
   ],
   "content-id":"/politics/2013/jul/21/tory-strategist-lynton-crosby-lobbying",
   "dc:title":"Tory strategist Lynton Crosby in new lobbying row | Politics | The Guardian",
   "description":"Exclusive: Firm he founded, Crosby Textor, advised private healthcare providers how to exploit NHS \u0027failings\u0027",
   "fb:app_id":180444840287,
   "keywords":"Lynton Crosby,Health policy,NHS,Health,Healthcare industry,Society,Public services policy,Lobbying,Conservatives,David Cameron,Politics,UK news,Business,Politics",
   "msapplication-TileColor":"#004983",
   "msapplication-TileImage":"http://static.guim.co.uk/static/a314d63c616d4a06f5ec28ab4fa878a11a692a2a/common/images/favicons/windows_tile_144_b.png",
   "news_keywords":"Lynton Crosby,Health policy,NHS,Health,Healthcare industry,Society,Public services policy,Lobbying,Conservatives,David Cameron,Politics,UK news,Business,Politics",
   "og:description":"Exclusive: Firm he founded, Crosby Textor, advised private healthcare providers how to exploit NHS \u0027failings\u0027",
   "og:image":"https://static-secure.guim.co.uk/sys-images/Guardian/Pix/pixies/2013/7/21/1374433351329/Lynton-Crosby-008.jpg",
   "og:site_name":"the Guardian",
   "og:title":"Tory strategist Lynton Crosby in new lobbying row",
   "og:type":"article",
   "og:url":"http://www.guardian.co.uk/politics/2013/jul/21/tory-strategist-lynton-crosby-lobbying",
   "resourceName":"tory-strategist-lynton-crosby-lobbying",
   "title":"Tory strategist Lynton Crosby in new lobbying row | Politics | The Guardian",
   "Twitter:app:id:googleplay":"com.guardian",
   "Twitter:app:id:iphone":409128287,
   "Twitter:app:name:googleplay":"The Guardian",
   "Twitter:app:name:iphone":"The Guardian",
   "Twitter:app:url:googleplay":"guardian://www.guardian.co.uk/politics/2013/jul/21/tory-strategist-lynton-crosby-lobbying",
   "Twitter:card":"summary_large_image",
   "Twitter:site":"@guardian"
}
2
sebilasse

Einfache und PHP eingebaute Funktion.

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

1
Jay Dave

Holen Sie sich Metatags von URL, PHP-Funktionsbeispiel:

function get_meta_tags ($url){
         $html = load_content ($url,false,"");
         print_r ($html);
         preg_match_all ("/<title>(.*)<\/title>/", $html["content"], $title);
         preg_match_all ("/<meta name=\"description\" content=\"(.*)\"\/>/i", $html["content"], $description);
         preg_match_all ("/<meta name=\"keywords\" content=\"(.*)\"\/>/i", $html["content"], $keywords);
         $res["content"] = @array("title" => $title[1][0], "descritpion" => $description[1][0], "keywords" =>  $keywords[1][0]);
         $res["msg"] = $html["msg"];
         return $res;
}

Beispiel:

print_r (get_meta_tags ("bing.com") );

Holen Sie sich Meta Tags php

1
x3m-bymer

Heute setzen die meisten Websites Meta-Tags zu ihren Websites, die Informationen über ihre Website oder eine bestimmte Artikelseite enthalten. Wie Nachrichten oder Blogseiten.

Ich habe eine Meta-API erstellt, die die erforderlichen Metadaten wie OpenGraph, Schema.Org usw. enthält.

Check it out - https://api.sakiv.com/docs

1
sakiv
<?php 

// ------------------------------------------------------ 

function curl_get_contents($url) {

    $timeout = 5; 
    $useragent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0'; 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_USERAGENT, $useragent); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
    $data = curl_exec($ch); 
    curl_close($ch); 

    return $data; 
}

// ------------------------------------------------------ 

function fetch_meta_tags($url) { 

    $html = curl_get_contents($url); 
    $mdata = array(); 

    $doc = new DOMDocument();
    $doc->loadHTML($html);

    $titlenode = $doc->getElementsByTagName('title'); 
    $title = $titlenode->item(0)->nodeValue;

    $metanodes = $doc->getElementsByTagName('meta'); 
    foreach($metanodes as $node) { 
    $key = $node->getAttribute('name'); 
    $val = $node->getAttribute('content'); 
    if (!empty($key)) { $mdata[$key] = $val; } 
    }

    $res = array($url, $title, $mdata); 

    return $res;
}

// ------------------------------------------------------ 

?>
1
sbmark

Wie bereits gesagt, kann damit das Problem gelöst werden:

$url='http://stackoverflow.com/questions/3711357/get-title-and-meta-tags-of-external-site/4640613';
$meta=get_meta_tags($url);
echo $title=$meta['title'];

//php - Get Title and Meta Tags of External site - Stack Overflow
0
Roger

Verbesserte Antwort von @shamittomar oben, um die Meta-Tags (oder die angegebene aus der HTML-Quelle) abzurufen.

Kann noch weiter verbessert werden ... Der Unterschied zu phps Standard-get_meta_tags besteht darin, dass es auch bei Unicode-Zeichenfolgen funktioniert

function getMetaTags($html, $name = null)
{
    $doc = new DOMDocument();
    try {
        @$doc->loadHTML($html);
    } catch (Exception $e) {

    }

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

    $data = [];
    for ($i = 0; $i < $metas->length; $i++)
    {
        $meta = $metas->item($i);

        if (!empty($meta->getAttribute('name'))) {
            // will ignore repeating meta tags !!
            $data[$meta->getAttribute('name')] = $meta->getAttribute('content');
        }
    }

    if (!empty($name)) {
        return !empty($data[$name]) ? $data[$name] : false;
    }

    return $data;
}
0
dav

Ich habe dieses kleine Composer-Paket basierend auf der Top-Antwort erstellt: https://github.com/diversen/get-meta-tags

composer require diversen/get-meta-tags

Und dann: 

use diversen\meta;

$m = new meta();

// Simple usage, get's title, description, and keywords by default
$ary = $m->getMeta('https://github.com/diversen/get-meta-tags');
print_r($ary);

// With more params
$ary = $m->getMeta('https://github.com/diversen/get-meta-tags', array ('description' ,'keywords'), $timeout = 10);
print_r($ary);

Es erfordert CURL und DOMDocument als oberste Antwort - und ist auf die Art und Weise aufgebaut, hat aber die Option, das Zeitlimit für die Curl-Einstellung (und das Abrufen aller Arten von Metatags) festzulegen. 

0
dennis

Wenn Sie mit PHP arbeiten, lesen Sie die Pear-Pakete unter pear.php.net und sehen Sie, ob Sie etwas Nützliches für Sie finden. Ich habe die RSS-Pakete effektiv verwendet und es spart viel Zeit, vorausgesetzt, Sie können anhand ihrer Beispiele verfolgen, wie sie ihren Code implementieren.

Werfen Sie einen Blick auf Sax 3 und sehen Sie, ob es für Ihre Bedürfnisse geeignet ist. Sax 3 wird nicht mehr aktualisiert, kann aber ausreichen.

0
Geekster

Sollten wir nicht OG verwenden?

Die gewählte Antwort ist gut, funktioniert jedoch nicht, wenn eine Site redirected ist (sehr häufig!) Und OG-Tags nicht zurückgibt. Dies sind der neue Industriestandard . Hier ist eine kleine Funktion, die 2018 ein bisschen mehr nutzbar ist. Sie versucht, OG-Tags zu erhalten, und greift auf Meta-Tags zurück, wenn sie nicht kippen:

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;
}

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

/////////////
//OUTPUT:
Array
(
    [title] => Stack Overflow - Where Developers Learn, Share, & Build Careers
    [description] => 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
)
0
cronoklee

Ich habe eine andere Arbeitsweise und dachte, ich würde sie teilen. Weniger Code als andere und gefunden hier . Ich habe ein paar Dinge hinzugefügt, um das Seiten-Meta zu laden, in dem Sie sich befinden, anstelle einer bestimmten Seite. Ich wollte, dass der Standard-Seitentitel und die Beschreibung automatisch in die og Tags kopiert werden.

Aus irgendeinem Grund, wie auch immer (verschiedene Scripts), die ich versucht habe, lädt die Seite extrem langsam online, aber sofort auf Wamp Ich bin mir nicht sicher, warum ich also wahrscheinlich mit einem Switch-Case gehe, da die Website nicht riesig ist.

<?php
$url = 'http://sitename.com'.$_SERVER['REQUEST_URI'];
$fp = fopen($url, 'r');

$content = "";

while(!feof($fp)) {
    $buffer = trim(fgets($fp, 4096));
    $content .= $buffer;
}

$start = '<title>';
$end = '<\/title>';

preg_match("/$start(.*)$end/s", $content, $match);
$title = $match[1];

$metatagarray = get_meta_tags($url);
$description = $metatagarray["description"];

echo "<div><strong>Title:</strong> $title</div>";
echo "<div><strong>Description:</strong> $description</div>";
?>

und im HTML-Header

<meta property="og:title" content="<?php echo $title; ?>" />
<meta property="og:description" content="<?php echo $description; ?>" />
0
e11world