2016-07-13 3 views
1

У меня есть функция, которая возвращает все ссылки img любой веб-страницы, но я хочу взять изображение, которое лучше всего представляет новость. Я знаю, что это немного сложный вопрос, но в каждой статье новостей есть главный образ статьи. Мне нужно выбрать его среди всех других изображений. Facebook и reddit, подобные сайтам, могут это сделать. У вас есть какая-то идея? Когда участники моего сайта поделились ссылкой, для этого должна быть картинка. Я могу взять весь URL-адрес изображений на веб-странице, теперь мне нужно найти основное изображение. :)Получение основного изображения с другого URL-адреса?

function get_links($url) { 
 

 
$xml = new DOMDocument(); 
 

 
libxml_use_internal_errors(true); 
 

 
$html = file_get_contents($url); 
 

 
if(!$xml->loadHTML($html)) { 
 
    $errors=""; 
 
    foreach (libxml_get_errors() as $error) { 
 
     $errors.=$error->message."<br/>"; 
 
    } 
 
    libxml_clear_errors(); 
 
    print "libxml errors:<br>$errors"; 
 
    return; 
 
} 
 

 
// Empty array to hold all links to return 
 
$links = array(); 
 

 
//Loop through each <img> tag in the dom and add it to the link array 
 
foreach ($xml->getElementsByTagName('img') as $link) { 
 
    $url = $link->getAttribute('src'); 
 
    if (!empty($url)) { 
 
     $links[] = $link->getAttribute('src'); 
 
    } 
 
} 
 

 
//Return the links 
 
return $links; 
 
}

+0

Look ИНТ o [Открыть график] (http://ogp.me/), если эти метатеги существуют, может быть разумным использовать их, например '' иначе все, что вам нужно, это атрибуты размера изображения или загрузка содержимого самостоятельно. также вы получите мой голос за использование DOMDocument! – Scuzzy

+0

Если вы идете против чего-то вроде CNN.com, у которого есть согласованная структура статей, я бы начал с консоли, чтобы проверить изображение, которое вы после, и посмотреть, есть ли у него какое-то соглашение об именах. Например, похоже, что в большинстве статей CNN есть контейнер на их основных изображениях со следующим классом: zn zn-large-media zn-body zn-idx-0 zn-has-one-container' Однако я не могу guarentee, это то же самое для всех статей .... – mwilson

+0

CNN - отличный пример использования открытого графика, например [эта статья] (http://edition.cnn.com/2016/07/11/politics/hillary-clinton- bernie-sanders/index.html) имеет следующий тег '' – Scuzzy

ответ

0

Вы можете улучшить существующую функцию, но если вы хотите, чтобы предпочтение существования данных Open Graph, добавьте это перед вашей getElementsByTagName('img') логики ...

$xpath = new DOMXPath($xml); 
if($xpathNodeList = $xpath->query('//meta[@property="og:image" and @content]')) 
{ 
    return array($xpathNodeList->item(0)->getAttribute('content')); 
} 

или добавить его в массив ...

// Empty array to hold all links to return 
$links = array(); 

$xpath = new DOMXPath($xml); 
if($xpathNodeList = $xpath->query('//meta[@property="og:image" and @content]')) 
{ 
    $links[] = $xpathNodeList->item(0)->getAttribute('content'); 
} 
+0

Спасибо, я попробую , ^^ – anor

Смежные вопросы