Удаленно очистите страницу и получите наиболее подходящее название или описание для изображений с XPath
То, на что я обращаю внимание - это то же самое, что кнопка Tweet или кнопка "Поделиться / Мне нравится" в Facebook, это очистка страницы и наиболее подходящего заголовка для фрагмента данных. Лучший пример, который я могу вспомнить, это когда вы находитесь на первой странице сайта со множеством статей и нажимаете кнопку "Мне нравится" в Facebook. Затем он получит правильную информацию для поста относительно (ближайшей) кнопки "Нравится". Некоторые сайты имеют теги Open Graph, но некоторые нет, и это все еще работает.
Поскольку это делается удаленно, я могу контролировать только те данные, на которые я хочу ориентироваться. В этом случае данные являются изображениями. Вместо того, чтобы получать только <title>
страницы, я ищу как-то пересечь дом в обратном направлении от начальной точки каждого изображения и найти ближайший "заголовок". Проблема в том, что не все заголовки появляются перед изображением. Однако вероятность появления изображения после заголовка в этом случае кажется довольно высокой. С учетом сказанного я надеюсь, что он будет работать практически на любом сайте.
Мысли:
- Найдите "контейнер" изображения и затем используйте первый блок текста.
- Найдите блоки текста в элементах, которые содержат определенные классы ("описание", "заголовок") или элементы (h1,h2,h3,h4).
Титульные резервные копии:
- Использование тегов Open Graph
- Используя только
<title>
- Использование только тэгов ALT
- Использование мета-тегов
Резюме: извлечение изображений не проблема, а как получить соответствующие названия для них.
Вопрос: Как бы вы получили соответствующие заголовки для каждого изображения? Возможно, используя DomDocument или XPath?
1 ответ
Ваш подход кажется достаточно хорошим, я бы просто придал вес определенным тегам / атрибутам и перебрал бы их с помощью запросов XPath, пока не найду что-то, что выходит, и оно не является пустым. Что-то вроде:
i = 0
while (//img[i][@src])
if (//img[i][@alt])
return alt
else if (//img[i][@description])
return description
else if (//img[i]/../p[0])
return p
else
return (//title)
i++
Простой пример XPath (функция перенесена из моего фреймворка):
function ph_DOM($html, $xpath = null)
{
if (is_object($html) === true)
{
if (isset($xpath) === true)
{
$html = $html->xpath($xpath);
}
return $html;
}
else if (is_string($html) === true)
{
$dom = new DOMDocument();
if (libxml_use_internal_errors(true) === true)
{
libxml_clear_errors();
}
if ($dom->loadHTML(ph()->Text->Unicode->mb_html_entities($html)) === true)
{
return ph_DOM(simplexml_import_dom($dom), $xpath);
}
}
return false;
}
И фактическое использование:
$html = file_get_contents('http://en.wikipedia.org/wiki/Photography');
print_r(ph_DOM($html, '//img')); // gets all images
print_r(ph_DOM($html, '//img[@src]')); // gets all images that have a src
print_r(ph_DOM($html, '//img[@src]/..')); // gets all images that have a src and their parent element
print_r(ph_DOM($html, '//img[@src]/../..')); // and so on...
print_r(ph_DOM($html, '//title')); // get the title of the page