Obtention de titres et de métabalises à partir d'un site Web externe
je veux essayer de trouver comment obtenir le
<title>A common title</title>
<meta name="keywords" content="Keywords blabla" />
<meta name="description" content="This is the description" />
même si c'est organisé dans un ordre quelconque, j'ai entendu parler du simple HTML DOM Parser de PHP mais je ne veux pas vraiment l'utiliser. Est-il possible pour une solution sauf en utilisant le simple HTML DOM Parser de PHP.
preg_match
ne sera pas en mesure de le faire si elle est invalide HTML?
est-ce que cURL peut faire quelque chose comme ça avec preg_match?
Facebook fait quelque chose comme cela, mais il est correctement utilisé en utilisant:
<meta property="og:description" content="Description blabla" />
je veux quelque chose comme ça pour qu'il soit possible quand quelqu'un poste un lien, il devrait récupérer le titre et les balises meta. S'il n'y a pas de meta tags, alors il l'a ignoré ou l'utilisateur peut le définir lui-même (mais je le ferai plus tard).
20 réponses
C'est comme ça que ça devrait être:
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";
<?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
?>
get_meta_tags
vous aidera avec tout sauf le titre. Pour obtenir le titre il suffit d'utiliser un regex.
$url = 'http://some.url.com';
preg_match("/<title>(.+)<\/title>/siU", file_get_contents($url), $matches);
$title = $matches[1];
Espère que ça aide.
Votre meilleur pari est de mordre la balle utiliser le DOM Parser - c'est la "bonne" façon de le faire. À long terme, cela vous fera gagner plus de temps qu'il n'en faut pour apprendre. Parsing HTML avec Regex est connu pour être peu fiable et intolérant des cas spéciaux.
get_meta_tags
n'a pas fonctionné avec le titre.
seulement les balises meta avec des attributs de nom comme
<meta name="description" content="the description">
sera analysé.
http://php.net/manual/en/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
?>
malheureusement, la fonction php get_meta_tags() nécessite le paramètre name, et certains sites, tels que twitter leave that off en faveur de l'attribut property. Cette fonction, utilisant un mélange de regex et de dom document, retournera un tableau de métabalises à clé d'une page web. Il vérifie le paramètre Nom, puis le paramètre propriété. Cela a été testé sur instragram, pinterest et twitter.
/**
* 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;
}
Nous utilisons des Apache Tika via php (utilitaire de ligne de commande) avec -j json :
<?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' );
?>
Ceci est un exemple de sortie aléatoire à partir d'un article du guardian :
{
"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"
}
Obtenir des balises meta à partir de l'url, php, fonction exemple:
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;
}
exemple:
print_r (get_meta_tags ("bing.com") );
<?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;
}
// ------------------------------------------------------
?>
de nos jours, la plupart des sites ajoutent des métabalises à leurs sites en fournissant des informations sur leur site ou toute page d'article en particulier. Comme des sites de nouvelles ou de blogs.
j'ai créé une API Meta qui vous donne les métadonnées requises ac comme OpenGraph, Schema.Org, etc.
Check it out - https://api.sakiv.com/docs
si vous travaillez avec PHP, consultez les paquets Pear à pear.php.net et voir si vous trouvez quelque chose d'utile pour vous. J'ai utilisé les paquets RSS efficacement et cela économise beaucoup de temps, à condition que vous puissiez suivre comment ils implémentent leur code via leurs exemples.
regardez spécifiquement Sax 3 et voyez si cela va fonctionner pour vos besoins. Sax 3 n'est plus mis à jour mais il pourrait être suffisant.
comme il a déjà été dit, cela peut gérer le problème:
$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
j'ai fait ce petit paquet de compositeur basé sur la réponse du haut: https://github.com/diversen/get-meta-tags
composer require diversen/get-meta-tags
et ensuite:
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);
il nécessite CURL et DOMDocument, comme la réponse supérieure - et est construit dans la manière, mais a l'option pour définir curl timeout (et pour obtenir toutes sortes de meta tags).
j'ai fait en sorte que ça marche différemment et j'ai pensé que je pourrais le partager. Moins de code que d'autres et trouvé ici . J'ai ajouté quelques choses pour le faire charger la page meta sur laquelle vous êtes au lieu d'une certaine page. Je voulais que cela copie le titre de la page par défaut et la description dans les balises og automatiquement.
Pour quelque raison que, quelque manière que ce soit (différents scripts) j'ai essayé, le chargement de la page super lent en ligne mais instant sur wamp . Je ne sais pas pourquoi donc je vais probablement avec un cas de commutateur puisque le site n'est pas énorme.
<?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>";
?>
et dans L'en-tête HTML
<meta property="og:title" content="<?php echo $title; ?>" />
<meta property="og:description" content="<?php echo $description; ?>" />
amélioration de la réponse de @shamittomar ci-dessus pour obtenir les balises meta (ou celle spécifiée à partir de la source html)
Peut encore être amélioré... la différence par rapport au get_meta_tags par défaut de php est qu'il fonctionne même quand il y a une chaîne unicode
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;
}
Voici PHP simple DOM HTML Class two line code to get page META details.
$html = file_get_html($link);
$meat_description = $html->find('head meta[name=description]', 0)->content;
$meat_keywords = $html->find('head meta[name=keywords]', 0)->content;
ne devrions-nous pas utiliser OG?
la réponse choisie est bonne mais ne fonctionne pas quand un site est redirigé (très commun!), et ne revient pas OG tags , qui sont le nouveau standard de l'industrie . Voici une petite fonction qui est un peu plus utilisable en 2018. Il essaie d'obtenir des balises OG et retombe sur les balises meta si il les déverse:
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/apple-touch-icon@2.png?v=73d79a89bded
)