Извлечение базовой информации из html?

#html #parsing #extraction #information-extraction

#HTML #синтаксический анализ #извлечение #извлечение информации

Вопрос:

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

Я хочу извлечь:

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

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

Комментарии:

1. tl; dr: используйте библиотеку синтаксического анализа html с xpath.

Ответ №1:

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

Например, в 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);
  

Комментарии:

1. спасибо за ответ, Алекс. к сожалению, в большинстве случаев веб-страницы не содержат необходимой мне информации в мета-тегах. часто сайты будут иметь один и тот же тег описания на всех подстраницах и не являются специфичными для страницы.

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

3. @sam Да, сложно выбрать, что такое основное изображение .