Извлечение основной информации из html? - PullRequest
1 голос
/ 24 апреля 2011

У меня есть проект, в котором пользователи отправляют множество ссылок на внешние сайты, и мне нужно проанализировать HTML-код этих отправленных ссылок и извлечь основную информацию со страницы так же, как это делают Digg и Facebook при отправке ссылки.

Я хочу получить:

  1. основной заголовок или заголовок (может быть в заголовке, h1, h2, p и т. Д ...)
  2. вступительное слово или текст описания (может быть в div, p и т. Д.)
  3. основное изображение

Моя главная проблема в том, что здесь слишком много вариантов для изучения, и я немного запутался, чтобы сесть меньше. Многие решения, которые я рассмотрел до сих пор, кажутся неадекватными или чрезмерными.

1 Ответ

2 голосов
/ 24 апреля 2011

Для этого вы бы выбрали язык на стороне сервера.

Например, в PHP вы можете использовать get_meta_tags() для метатегов ...

$meta = get_meta_tags('http://google.com');

И вы можете использовать DOMDocument для получения элемента title (некоторые могут возразить, если нужен элемент title, вы также можете использовать DOMDocument для получения метатегов).

$dom = new DOMDocument;

$dom->loadHTML('http://google.com');

$title = $dom
           ->getElementsByTagName('head')
           ->item(0)
           ->getElementsByTagName('title')
           ->item(0)
           ->nodeValue;

Что касается получения основного изображения , это потребует некоторого извлечения того, что можно считать основным изображением. Вы можете получить все элементы img и найти самый большой элемент на странице.

$dom = new DOMDocument;

$dom->loadHTML('http://google.com');

$imgs = $dom
         ->getElementsByTagName('body')
         ->item(0)
         ->getElementsByTagName('img');

$imageSizes = array();

foreach($imgs as $img) {

  if ( ! $img->hasAttribute('src')) {
     continue;
  }

  $src = $img->getAttribute('src');

  // May need to prepend relative path
  // Assuming Apache, http and port 80

  $relativePath = rtrim($_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'], '/') . '/';

  if (substr($src, 0, strlen($relativePath) !== $relativePath) {
     $src = $relativePath . $src;
  }

  $imageInfo = getimageinfo($src);

  if ( ! $imageInfo) {
     continue;
  }    

  list($width, $height) = $imageInfo;

  $imageSizes[$width * $height] = $img;

}

$mainImage = end($imageSizes);
...