Удаленно очистите страницу и получите наиболее подходящее название или описание для изображений с помощью XPath


То, что я собираюсь сделать, по сути, то же самое, что делает кнопка "Твит" или кнопка "Поделиться/нравится" в Facebook, а именно: очистить страницу и наиболее подходящее название для части данных. Лучший пример, который я могу придумать, - это когда вы находитесь на главной странице веб-сайта со множеством статей и нажимаете кнопку "Мне нравится" в Facebook. Затем он получит соответствующую информацию для публикации относительно (ближайшей) кнопки "Мне нравится". На некоторых сайтах есть теги Open Graph, но на некоторых их нет, и это все еще работает.

Поскольку это делается удаленно, у меня есть только контроль над данными, на которые я хочу нацелиться. В этом случае данные являются изображениями. Вместо того, чтобы извлекать только <title> страницы, я пытаюсь каким-то образом обойти dom в обратном порядке от начальной точки каждого изображения и найти ближайший "заголовок". Проблема в том, что не все заголовки появляются перед изображением. Однако вероятность того, что изображение появится после заголовка в этом случае, кажется довольно высокой. С учетом сказанного, я надеюсь сделать это хорошо работает практически на любом сайте.

Мысли:

  • Найдите "контейнер" изображения, а затем используйте первый блок текста.
  • Найдите блоки текста в элементах, которые содержат определенные классы ("описание", "заголовок") или элементы (h1, h2, h3, h4).

Резервные копии заголовков:

  • Использование тегов Открытого графика
  • Используя только <title>
  • Использование только тегов ALT
  • Использование МЕТА-тегов

Резюме: Извлечение изображений не является проблема в том, как получить для них соответствующие названия.

Вопрос: Как бы вы поступили, чтобы получить соответствующие заголовки для каждого из изображений? Возможно, используя DOMDocument или XPath?

Author: stwhite, 2012-05-19

1 answers

Ваш подход кажется достаточно хорошим, я бы просто присвоил определенным тегам/атрибутам вес и просматривал их с помощью запросов 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
 1
Author: Alix Axel, 2012-05-20 16:12:12