0

簡単な抽出をしようとしていますが、予測できない結果になり続けています。

私はこのHTMLコードを持っています

<div class="thread" style="margin-bottom:25px;"> 

<div class="message"> 

<span class="profile">Suzy Creamcheese</span> 

<span class="time">December 22, 2010 at 11:10 pm</span> 

<div class="msgbody"> 

<div class="subject">New digs</div> 

Hello thank you for trying our soap. <BR>  Jim.

</div> 
</div> 


<div class="message reply"> 

<span class="profile">Lars Jörgenmeier</span> 

<span class="time">December 22, 2010 at 11:45 pm</span> 

<div class="msgbody"> 

I never sold you any soap.

</div> 

</div> 

</div> 

そして、「msgbody」から外部テキストを抽出しようとしていますが、「プロファイル」が何かと等しい場合のみです。そのようです。

$contents  = $html->find('.msgbody');
$elements = $html->find('.profile'); 

           $length = sizeof($contents);

           while($x != sizeof($elements)) {

            $var = $elements[$x]->outertext;

                        //If profile = the right name
            if ($var = $name) {

                                    $text = $contents[$x]->outertext;
                echo $text;

            }



            $x++;
         }    

必要な関連付けを持つプロファイルではなく、間違ったプロファイルからテキストを取得します。1行のコードで目的の情報を取得する方法はありますか?

span-profile = "正しい名前" の場合のように、その div-msgbody をプルします

4

2 に答える 2

3

さて、これでDOMXpathを使用します。「外側のテキスト」が何を意味するのかはわかりませんが、次の要件に従います。

span-profile = "正しい名前" の場合のように、その div-msgbody をプルします

まず、私が使用した縮小された HTML テスト ケースを次に示します。

<html>
<body>
<div class="thread" style="margin-bottom:25px;"> 

<div class="message"> 

<span class="profile">Suzy Creamcheese</span> 

<span class="time">December 22, 2010 at 11:10 pm</span> 

<div class="msgbody"> 

<div class="subject">New digs</div> 

Hello thank you for trying our soap. <BR>  Jim.

</div> 
</div> 


<div class="message reply"> 

<span class="profile">Lars Jörgenmeier</span> 

<span class="time">December 22, 2010 at 11:45 pm</span> 

<div class="msgbody"> 

I never sold you any soap.

</div> 

</div> 

</div>
</body>
</html>

そのため、このための XPath クエリを作成します。全体を示してから、分解してみましょう。

$messages = $xpath->query("//span[@class='profile' and contains(.,'$profile_name')]/../div[@class='msgbody']");

内訳:

//スパン

スパンをください

//span[@class='プロファイル']

クラスがプロファイルであるスパンを教えてください

//span[@class='profile' and contains(.,'$profile_name')]

class が profile で、スパンの内側に が含まれるスパン$profile_nameを教えてください。これはあなたが求めている名前です

//span[@class='profile' and contains(.,'$profile_name')]/../

クラスがプロファイルで、スパンの内側に含まれるスパン$profile_nameを教えてください。これは、あなたが求めている名前です。レベルを上げて、<div class="message">

//span[@class='profile' and contains(.,'$profile_name')]/../div[@class='msgbody']

クラスがプロファイルで、スパンの内側に が含まれているスパン$profile_nameを教えてください。これは、あなたが求めている名前です。レベルを上げて<div class="message">、最後に<div class="message"> 、クラスが msgbody である場所の下にあるすべての div を教えてください。

それでは、PHP コードのサンプルを次に示します。

$doc = new DOMDocument();
$doc->loadHTMLFile("test.html");

$xpath = new DOMXpath($doc);
$profile_name = 'Lars Jörgenmeier';
$messages = $xpath->query("//span[@class='profile' and contains(.,'$profile_name')]/../div[@class='msgbody']");
foreach ($messages as $message) {
  echo trim("{$message->nodeValue}") . "\n";
}

XPath はこのように非常に強力です。基本的なチュートリアルに目を通しておくことをお勧めします。さらに高度な使用法を確認したい場合は、XPath 標準を確認してください。

于 2011-05-22T00:41:41.650 に答える
0

これは単純な HTML DOM の動作例です。

次のように、Suzy Creamcheese の複数のプロファイルが存在するように、例の html を変更しました: (ファイル: test_class_class.htm)

 <div class="message"> 
   <span class="profile">Suzy Creamcheese</span> 
   <span class="time">December 22, 2010 at 11:10 pm</span> 
   <div class="msgbody"> 
     <div class="subject">New digs</div> 
       Hello thank you for trying our soap. <BR>  Jim.
     </div> 
   </div> 

   <div class="message reply"> 
     <span class="profile">Lars Jörgenmeier</span> 
     <span class="time">December 22, 2010 at 11:45 pm</span> 
     <div class="msgbody"> 
       I never sold you any soap.
     </div> 
   </div> 
 </div>

 <div class="message"> 
   <span class="profile">Suzy Yogurt</span> 
   <span class="time">December 22, 2010 at 11:10 pm</span> 
   <div class="msgbody"> 
     <div class="subject">No Creamcheese</div> 
       This is not Suzy Creamcheese <BR>  Jim.
     </div> 
   </div> 

   <div class="message reply"> 
     <span class="profile">Suzy Creamcheese</span> 
     <span class="time">December 22, 2010 at 11:45 pm</span> 
     <div class="msgbody"> 
       A reply from Suzy Creamcheese.
     </div> 
   </div> 
 </div>

</div>

Simple HTML DOM を使用したテストは次のとおりです。

function getMessage_for_profile($iUrl,$iProfile)
{
    // create HTML DOM
    $html = file_get_html($iUrl);

    // get text elements
    $aoProfile = $html->find('span[class=profile]'); 
    echo "Found ".count($aoProfile)." profiles.<br />";

    foreach ($aoProfile as $key=>$oProfile)
    {
      if ($oProfile->plaintext == $iProfile)
      {
        echo "<b>Profile ".$key.": ".$oProfile->plaintext."</b><br />";
// Using $e->next_sibling ()
        $oCurrent = $oProfile;
        while ($oNext = $oCurrent->next_sibling())
        {
           if ( $oNext->class == "msgbody" )
           {
             echo "<hr />";
             echo $oNext->outertext;
             echo "<hr />";
           }
           $oCurrent = $oNext;
        }
      }         
    }

    // clean up memory
    $html->clear();
    unset($html);

    return;
}
// --------------------------------------------
// test it!
// user_agent header...
ini_set('user_agent', 'My-Application/2.5');

getMessage_for_profile('test_class_class.htm','Suzy Creamcheese');
echo "<br /><br /><br />";
getMessage_for_profile('test_class_class.htm','Suzy Yogurt');

私の出力は次のとおりです。

Found 4 profiles.
Profile 0: Suzy Creamcheese
--------------------------------
New digs
Hello thank you for trying our soap.
Jim.
---------------------------------
Profile 3: Suzy Creamcheese
---------------------------------
A reply from Suzy Creamcheese.
---------------------------------



Found 4 profiles.
Profile 2: Suzy Yogurt
---------------------------------
No Creamcheese
This is not Suzy Creamcheese
Jim.
---------------------------------

シンプルな HTML DOM で実行できることを確認してください。私は DOM がどのように機能するかを既に知っているため...またはトラブルに巻き込まれるのに十分です...既知の構文を学ぶ必要はありませんでした!

于 2011-07-02T09:17:19.400 に答える