web-dev-qa-db-fra.com

Obtenez le titre du site Web via un lien

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?

35
Noob

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

61
Jose Vega
$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.

31
Matthew

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.

6
James Sumners

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".

5
Cups

manuel PHP sur cURL

<?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.

4
Novikov

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/ )

2
Sudhir Jonathan

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;
}
1
Kise Xu

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):

  1. Un paramètre HTTP "charset" dans un champ "Content-Type".
  2. Une déclaration META avec "http-equiv" défini sur "Content-Type" et une valeur définie pour "charset".
  3. L'attribut charset défini sur un élément qui désigne une ressource externe.

(voir http://www.w3.org/TR/html4/charset.html )

puis utilise iconv pour convertir le titre en utf-8 encodage.

1
xianyu

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

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

0
Jake