Получить титул веб-сайта по ссылке
Обратите внимание, что Новости Google содержит источники в нижней части каждого отрывка из статьи.
The Guardian - Новости ABC - Рейтер - Bloomberg
Я пытаюсь подражать этому.
Например, после отправки URL http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/
я хочу вернуть The Washington Times
Как это возможно с php?
Ответы
Ответ 1
Мой ответ распространяется на ответ @AI W на использование заголовка страницы. Ниже приведен код для выполнения того, что он сказал.
<?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/");
?>
OUTPUT
Washington Times - Политика, Разрушение Новости, США и мировые новости
Как вы можете видеть, это не совсем то, что Google использует, поэтому это заставляет меня думать, что они получают URL-адрес хоста и сопоставляют его со своим списком.
http://www.washingtontimes.com/ = > The Washington Times
Ответ 2
$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";
Вывод:
Комиссионная задолженность падает на тестовое голосование - Washington Times
Очевидно, что вы также должны выполнять базовую обработку ошибок.
Ответ 3
Вы можете получить содержимое URL-адреса и выполнить поиск регулярного выражения для содержимого элемента title
.
<?php
$urlContents = file_get_contents("http://example.com/");
preg_match("/<title>(.*)<\/title>/i", $urlContents, $matches);
print($matches[1] . "\n"); // "Example Web Page"
?>
Или, если вы не хотите использовать регулярное выражение (чтобы соответствовать чему-то очень близко к началу документа), вы можете использовать объект 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"
?>
Я оставляю это для вас, чтобы решить, какой метод вам больше всего нравится.
Ответ 4
Используя get_meta_tags() с домашней страницы домена, NYT возвращает то, что может потребоваться усечению, но может быть полезно.
$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 );
включает описание "The Washington Times" публикует последние новости и комментарии по вопросам, которые влияют на будущее нашей нации ".
Ответ 5
Руководство по PHP 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 по регулярному выражению Perl
<?php
$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);
print_r($matches);
?>
И соединяя эти два:
<?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);
?>
Я не могу обещать, что этот пример будет работать, так как у меня здесь нет PHP, но он должен помочь вам начать работу.
Ответ 6
Если вы хотите использовать сторонний сервис для этого, я просто построил его на www.runway7.net/radar
Дает вам название, описание и многое другое. Например, попробуйте ваш пример на Radar.
(http://radar.runway7.net/?url=http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/)
Ответ 7
В качестве альтернативы вы можете использовать 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;
Ответ 8
Я написал функцию для ее обработки:
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;
}
он извлекает содержимое веб-страницы и пытается получить кодировку кодировки документа с помощью ((от наивысшего приоритета до самого низкого):
- Параметр "charset" HTTP в поле "Content-Type".
- Объявление META с параметром "http-equiv" для "Content-Type" и значением, установленным для "charset".
- Атрибут charset установлен на элемент, который обозначает внешний ресурс.
(см. http://www.w3.org/TR/html4/charset.html)
а затем использует iconv
для преобразования заголовка в utf-8
.
Ответ 9
Получить титул веб-сайта по ссылке и конвертировать заголовок в кодировку символов 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;
}
Ответ 10
Я стараюсь избегать регулярных выражений, когда это необязательно, я создал функцию, чтобы получить заголовок сайта с curl и DOMDocument ниже.
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/');
выше возвращает следующее: Добро пожаловать в Facebook - Войдите в систему, зарегистрируйтесь или узнайте больше