2012-05-19 8 views
5

私がやっていることは、TweetボタンやFacebook Share/Likeボタンと基本的に同じことです。 1つのデータの関連タイトル。私が考えることができる最も良い例は、あなたが多くの記事を含むウェブサイトのフロントページにいて、Facebook Likeボタンをクリックしたときです。それから、ポストの適切な情報が「Like」ボタンに(最も近い)相対的に表示されます。一部のサイトにはOpen Graphタグがありますが、一部のサイトではまだ機能していません。リモートでページをスクラブし、XPathで画像に最も関連性の高いタイトルまたは説明を取得

これはリモートで行われるため、私はターゲットとするデータを制御するだけです。この場合、データは画像である。ページの<title>だけを取り出すのではなく、逆に各画像の開始点からdomをたどり、最も近い「タイトル」を見つけることを探しています。問題は、すべてのタイトルが画像の前に出現するわけではないということです。しかし、この場合のタイトルの後に画像が出現する可能性はかなり高いようです。それがほぼすべてのサイトでうまく動作するようにすることが私の希望です。

思考:

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

タイトルのバックアップ:抽出画像:ちょうど<title>

  • 使用ALTタグを使用して

    • 使用してグラフを開くタグ
    • METAタグ

    概要を使用してそれは問題ではない、それはそれらのための関連するタイトルを取得する方法です。

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

  • +0

    、あなたはPHPでそれをこすりした後、もし小さなJava WebサーバーへのREST呼び出しを介してそれを渡すことができます.JSOUPを使用すると、これらの要素と属性すべてに簡単にアクセスできます。 JSOUPはjQuery for Javaと似ており、同じ構文を使用します。私はそれがあなたの問題を数秒で遠ざけるようにするためにPHPで利用できることを望みます! – jmort253

    +0

    イメージを直接扱うものはわかりませんが、ページからのコンテンツの抽出を扱うライブラリがいくつかあります。しかし、あなたはいくつかのアイデアや指示を得るか、それらを使うことができるかもしれません。ここに一つです:http://code.google.com/p/boilerpipe/wiki/Components –

    +1

    あなたの考えをありがとう。私は自分のイメージをどうやって取得するのではなく、それぞれのイメージに関連するタイトルや説明を得ることの背後にある "論理"をもっとターゲットにして質問を更新しました。 – stwhite

    答えて

    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の例(機能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; 
    } 
    

    そして、実際の使用状況:正直なところ

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

    私はXPathについて読んで、実際にいくつかのオプションをテストし始めましたが、これを拡張できますか?ノード間の距離を見つけることは良いアイデアのように思えますが、私はまだ解決策を考え出していません。 – stwhite

    +0

    @stwhite:実際はそれは私の考えではなく、あなたは特異性の最高レベル(「img」タグ)から始まり、説明的なものとして考えるべきものが見つかるまで、あなたのやり方で作業します。 –

    +0

    私はこれがあなたの最初のアイデアではないことを認識していますが、見つかったノード間の距離を取得する方法はありますか?例えば、画像から先行するh2までの距離に対する前のH1までの現在の画像の位置を見つける。これは一見「良い」タイトルである可能性が高いスコアを与えるように見えるだろう。 本質的に、どちらが最初に来たのか、どちらが画像に近いのかが本当にわかります。 – stwhite

    関連する問題