1

PHP DOM を使用して子要素のテキストを取得しようとしています。

具体的には、<a>すべての内の最初のタグのみを取得しようとしてい<tr>ます。

HTMLはこんな感じ…

<table>
<tbody>
    <tr>
        <td>
            <a href="#">1st Link</a>
        </td>
        <td>
            <a href="">2nd Link</a>
        </td>
        <td>
            <a href="#">3rd Link</a>
        </td>
    </tr>

    <tr>
        <td>
            <a href="#">1st Link</a>
        </td>
        <td>
            <a href="#">2nd Link</a>
        </td>
        <td>
            <a href="#">3rd Link</a>
        </td>
    </tr>
</tbody>
</table>

私の悲しい試みにはforeach()ループの使用が含まれArray()ていましたprint_r()が、$aVal.

$dom = new DOMDocument();
libxml_use_internal_errors(true);       
$dom->loadHTML(returnURLData($url));
libxml_use_internal_errors(false);
    
$tables = $dom->getElementsByTagName('table');
$aVal = array();

foreach ($tables as $table) {
    foreach ($table as $tr){
        $trVal = $tr->getElementsByTagName('tr');
        foreach ($trVal as $td){
            $tdVal = $td->getElementsByTagName('td');
            foreach($tdVal as $a){
                $aVal[] = $a->getElementsByTagName('a')->nodeValue;
            }
        }
    }
}

私は正しい軌道に乗っていますか、それとも完全に外れていますか?

4

3 に答える 3

0

私は遅れていると確信していますが、より良い方法は、getElementByTagName を使用してすべての「tr」を反復し、受信したノードリストの各ノードを反復しながら getElementByTagName「a」を使用することです。これで、item(0) によって受信された最初の要素を指す nodeList を反復処理する必要がなくなりました。それでおしまい!もう 1 つの方法は、xPath を使用することです。

私は個人的に SimpleHtmlDom が好きではありません。なぜなら、SimpleHtmlDom は、小さな機能が必要な場合に使用する追加機能がたくさんあるからです。大量のスクレイピングの場合、メモリ管理の問題も妨げになる可能性があります。サードパーティのアプリケーションに依存するのではなく、自分で DOM 分析を行う方がよいでしょう。

私の意見です。私も最初はSHDを使用していましたが、後でこれに気付きました。

于 2013-09-11T08:26:23.227 に答える
-1

あなたは設定$trVal$tdValていませんが、それらをループしていますか?

于 2013-05-24T01:12:13.410 に答える