webentwicklung-frage-antwort-db.com.de

Holen Sie sich den Titel der Website per Link

Beachten Sie, wie Google News unten in jedem Artikelauszug Quellen enthält.

Der Wächter - ABC News - Reuters - Bloomberg

Ich versuche das nachzuahmen.

Zum Beispiel nach dem Absenden der URL http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/ Ich möchte zurück The Washington Times

Wie ist das mit PHP möglich?

35
Noob

Meine Antwort erweitert die Antwort von @AI W, den Titel der Seite zu verwenden. Unten ist der Code, um das zu erreichen, was er gesagt hat.

<?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/");

?>

[~ # ~] Ausgabe [~ # ~]

Washington Times - Politik, aktuelle Nachrichten, US- und Weltnachrichten

Wie Sie sehen, ist es nicht genau das, was Google verwendet. Daher glaube ich, dass sie den Hostnamen einer URL erhalten und mit ihrer eigenen Liste abgleichen.

http://www.washingtontimes.com/ => Die 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";

Ausgabe:

Schuldenkommission unterschreitet Teststimme - Washington Times

Natürlich sollten Sie auch eine grundlegende Fehlerbehandlung implementieren.

31
Matthew

Sie können den Inhalt der URL abrufen und mit einem regulären Ausdruck nach dem Inhalt des Elements title suchen.

<?php
$urlContents = file_get_contents("http://example.com/");
preg_match("/<title>(.*)<\/title>/i", $urlContents, $matches);

print($matches[1] . "\n"); // "Example Web Page"
?>

Wenn Sie keinen regulären Ausdruck verwenden möchten (um etwas ganz oben im Dokument zu finden), können Sie auch ein DOMDocument-Objekt verwenden:

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

Ich überlasse es Ihnen zu entscheiden, welche Methode Ihnen am besten gefällt.

6
James Sumners

Die Verwendung von get_meta_tags () von der Domain-Homepage für NYT bringt etwas zurück, das möglicherweise abgeschnitten werden muss, aber nützlich sein könnte.

$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 );

enthält die Beschreibung "Die Washington Times liefert aktuelle Nachrichten und Kommentare zu den Themen, die die Zukunft unserer Nation betreffen."

5
Cups

PHP-Handbuch zu 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);
?>

PHP Handbuch zum Perl Regex Matching

<?php
$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);
print_r($matches);
?>

Und diese beiden zusammenfügen:

<?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);      
?>

Ich kann nicht versprechen, dass dieses Beispiel funktioniert, da ich PHP hier nicht habe, aber es sollte Ihnen den Einstieg erleichtern.

4
Novikov

Wenn Sie dazu bereit sind, einen Drittanbieter-Service zu nutzen, habe ich einen unter www.runway7.net/radar erstellt

Gibt Ihnen Titel, Beschreibung und vieles mehr. Versuchen Sie zum Beispiel Ihr Beispiel auf Radar . ( http://radar.runway7.net/?url=http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/ )

2
Sudhir Jonathan

Holen Sie sich den Titel der Website per Link und konvertieren Sie den Titel in eine UTF-8-Zeichenkodierung:

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

ich habe eine Funktion geschrieben, um damit umzugehen:

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

es ruft den Inhalt der Webseite ab und versucht, die Zeichensatzkodierung des Dokuments zu ermitteln (von der höchsten zur niedrigsten Priorität):

  1. Ein HTTP "Zeichensatz" -Parameter in einem "Content-Type" -Feld.
  2. Eine META-Deklaration, bei der "http-equiv" auf "Content-Type" und ein Wert für "charset" festgelegt ist.
  3. Das Zeichensatzattribut, das für ein Element festgelegt wird, das eine externe Ressource bezeichnet.

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

und konvertiert dann mit iconv den Titel in utf-8 Kodierung.

1
xianyu

Alternativ können Sie Simple Html Dom Parser verwenden:

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

Ich versuche, reguläre Ausdrücke zu vermeiden, wenn dies nicht erforderlich ist. Ich habe eine Funktion erstellt, um den Titel der Website mit curl und DOMDocument unten abzurufen.

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

oben wird Folgendes zurückgegeben: Willkommen bei Facebook - Anmelden, Registrieren oder Weitere Informationen

0
Jake