#html #parsing #extraction #information-extraction
#HTML #синтаксический анализ #извлечение #извлечение информации
Вопрос:
У меня есть проект, в котором пользователи отправляют много ссылок на внешние сайты, и мне нужно проанализировать HTML этих отправленных ссылок и извлечь основную информацию со страницы таким же образом, как это делают Digg и Facebook при отправке ссылки.
Я хочу извлечь:
- основной заголовок (может быть в title,
h1
,h2
p
и т.д.) - вводный текст или текст описания (может быть в
div
,p
и т.д.) - основное изображение
Моя главная проблема заключается в том, что, похоже, здесь слишком много вариантов для изучения, и я, по меньшей мере, немного запутался. Многие решения, которые я рассмотрел до сих пор, кажутся неадекватными или огромным излишеством.
Комментарии:
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 Да, сложно выбрать, что такое основное изображение .