Remarquez comment Google News a des sources au bas de chaque extrait d'article.
The Guardian - ABC News - Reuters - Bloomberg
J'essaie d'imiter ça.
Par exemple, lors de la soumission de l'URL http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/
Je veux retourner The Washington Times
Comment est-ce possible avec php?
Ma réponse se développe sur la réponse de @AI W d'utiliser le titre de la page. Voici le code pour accomplir ce qu'il a dit.
<?php
function get_title($url){
$str = file_get_contents($url);
if(strlen($str)>0){
$str = trim(preg_replace('/\s+/', ' ', $str)); // supports line breaks inside <title>
preg_match("/\<title\>(.*)\<\/title\>/i",$str,$title); // ignore case
return $title[1];
}
}
//Example:
echo get_title("http://www.washingtontimes.com/");
?>
[~ # ~] sortie [~ # ~]
Washington Times - Politique, dernières nouvelles, nouvelles américaines et mondiales
Comme vous pouvez le voir, ce n'est pas exactement ce que Google utilise, donc cela m'amène à croire qu'ils obtiennent le nom d'hôte d'une URL et le font correspondre à leur propre liste.
http://www.washingtontimes.com/ => The Washington Times
$doc = new DOMDocument();
@$doc->loadHTMLFile('http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/');
$xpath = new DOMXPath($doc);
echo $xpath->query('//title')->item(0)->nodeValue."\n";
Sortie:
La commission de la dette ne répond pas à un vote test - Washington Times
Évidemment, vous devez également implémenter la gestion des erreurs de base.
Vous pouvez récupérer le contenu de l'URL et faire une recherche d'expression régulière pour le contenu de l'élément title
.
<?php
$urlContents = file_get_contents("http://example.com/");
preg_match("/<title>(.*)<\/title>/i", $urlContents, $matches);
print($matches[1] . "\n"); // "Example Web Page"
?>
Ou, si vous ne voulez pas utiliser une expression régulière (pour faire correspondre quelque chose de très proche du haut du document), vous pouvez utiliser un objet DOMDocument :
<?php
$urlContents = file_get_contents("http://example.com/");
$dom = new DOMDocument();
@$dom->loadHTML($urlContents);
$title = $dom->getElementsByTagName('title');
print($title->item(0)->nodeValue . "\n"); // "Example Web Page"
?>
Je vous laisse le soin de décider quelle méthode vous préférez.
En utilisant get_meta_tags () à partir de la page d'accueil du domaine, pour NYT ramène quelque chose qui pourrait avoir besoin d'être tronqué mais qui pourrait être utile.
$b = "http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/" ;
$url = parse_url( $b ) ;
$tags = get_meta_tags( $url['scheme'].'://'.$url['Host'] );
var_dump( $tags );
comprend la description "Le Washington Times fournit des nouvelles de dernière heure et des commentaires sur les questions qui affectent l'avenir de notre nation".
<?php
$ch = curl_init("http://www.example.com/");
$fp = fopen("example_homepage.txt", "w");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);
?>
Manuel PHP sur la correspondance des expressions rationnelles Perl
<?php
$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);
print_r($matches);
?>
Et mettre ces deux ensemble:
<?php
// create curl resource
$ch = curl_init();
// set url
curl_setopt($ch, CURLOPT_URL, "example.com");
//return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// $output contains the output string
$output = curl_exec($ch);
$pattern = '/[<]title[>]([^<]*)[<][\/]titl/i';
preg_match($pattern, $output, $matches);
print_r($matches);
// close curl resource to free up system resources
curl_close($ch);
?>
Je ne peux pas promettre que cet exemple fonctionnera car je n'ai pas PHP ici, mais cela devrait vous aider à démarrer.
Si vous êtes prêt à utiliser un service tiers pour cela, je viens d'en créer un sur www.runway7.net/radar
Vous donne le titre, la description et bien plus encore. Par exemple, essayez votre exemple sur Radar . ( http://radar.runway7.net/?url=http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/ )
Obtenez le titre du site Web via un lien et convertissez le titre en encodage de caractères utf-8 :
https://Gist.github.com/kisexu/b64bc6ab787f302ae838
function getTitle($url)
{
// get html via url
$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$html = curl_exec($ch);
curl_close($ch);
// get title
preg_match('/(?<=<title>).+(?=<\/title>)/iU', $html, $match);
$title = empty($match[0]) ? 'Untitled' : $match[0];
$title = trim($title);
// convert title to utf-8 character encoding
if ($title != 'Untitled') {
preg_match('/(?<=charset\=).+(?=\")/iU', $html, $match);
if (!empty($match[0])) {
$charset = str_replace('"', '', $match[0]);
$charset = str_replace("'", '', $charset);
$charset = strtolower( trim($charset) );
if ($charset != 'utf-8') {
$title = iconv($charset, 'utf-8', $title);
}
}
}
return $title;
}
j'ai écrit une fonction pour le gérer:
function getURLTitle($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$content = curl_exec($ch);
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
$charset = '';
if($contentType && preg_match('/\bcharset=(.+)\b/i', $contentType, $matches)){
$charset = $matches[1];
}
curl_close($ch);
if(strlen($content) > 0 && preg_match('/\<title\b.*\>(.*)\<\/title\>/i', $content, $matches)){
$title = $matches[1];
if(!$charset && preg_match_all('/\<meta\b.*\>/i', $content, $matches)){
//order:
//http header content-type
//meta http-equiv content-type
//meta charset
foreach($matches as $match){
$match = strtolower($match);
if(strpos($match, 'content-type') && preg_match('/\bcharset=(.+)\b/', $match, $ms)){
$charset = $ms[1];
break;
}
}
if(!$charset){
//meta charset=utf-8
//meta charset='utf-8'
foreach($matches as $match){
$match = strtolower($match);
if(preg_match('/\bcharset=([\'"])?(.+)\1?/', $match, $ms)){
$charset = $ms[1];
break;
}
}
}
}
return $charset ? iconv($charset, 'utf-8', $title) : $title;
}
return $url;
}
il récupère le contenu de la page Web et essaie d'obtenir le codage du jeu de caractères du document par ((de la priorité la plus élevée à la plus faible):
(voir http://www.w3.org/TR/html4/charset.html )
puis utilise iconv
pour convertir le titre en utf-8
encodage.
Alternativement, vous pouvez utiliser Simple Html Dom Parser :
<?php
require_once('simple_html_dom.php');
$html = file_get_html('http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/');
echo $html->find('title', 0)->innertext . "<br>\n";
echo $html->find('div[class=entry-content]', 0)->innertext;
J'essaie d'éviter les expressions régulières lorsque cela n'est pas nécessaire, j'ai créé une fonction pour obtenir le titre du site Web avec curl et DOMDocument ci-dessous.
function website_title($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// some websites like Facebook need a user agent to be set.
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36');
$html = curl_exec($ch);
curl_close($ch);
$dom = new DOMDocument;
@$dom->loadHTML($html);
$title = $dom->getElementsByTagName('title')->item('0')->nodeValue;
return $title;
}
echo website_title('https://www.facebook.com/');
ci-dessus renvoie les informations suivantes: Bienvenue sur Facebook - Connectez-vous, inscrivez-vous ou en savoir plus