5

私が検討しているのは、基本的にはツイート ボタンや Facebook の共有/いいねボタンと同じことです。つまり、ページとデータの最も関連性の高いタイトルをスクレイピングすることです。私が思いつく最良の例は、多くの記事を含む Web サイトのトップページにいて、Facebook の「いいね」ボタンをクリックしたときです。次に、(最も近い) Like ボタンに関連する投稿の適切な情報を取得します。一部のサイトには Open Graph タグがありますが、一部のサイトにはありませんが、それでも機能します。

これはリモートで行われるため、対象とするデータのみを制御できます。この場合、データは画像です。ページ<title>の . 問題は、すべてのタイトルが画像の前にあるわけではないことです。ただし、この場合、タイトルの後に画像が表示される可能性はかなり高いようです。そうは言っても、ほぼすべてのサイトでうまく機能するようにしたいと思っています。

考え:

  • 画像の「コンテナ」を見つけて、テキストの最初のブロックを使用します。
  • 特定のクラス (「説明」、「タイトル」) または要素 (h1、h2、h3、h4) を含む要素内のテキスト ブロックを見つけます。

タイトルのバックアップ:

  • Open Graph タグの使用
  • だけを使用して<title>
  • ALT タグのみを使用する
  • META タグの使用

概要: 画像を抽出することは問題ではなく、関連するタイトルを取得する方法です。

質問:各画像に関連するタイトルを取得するにはどうすればよいですか? おそらくDomDocumentまたはXPathを使用していますか?

4

1 に答える 1

1

Your approach seems good enough, I would just give certain tags / attributes a weight and loop through them with XPath queries until I find something that exits and it's not void. Something like:

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++

A simple XPath example (function ported from my framework):

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;
}

And the actual usage:

$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
于 2012-05-19T18:46:22.920 に答える