2

最近、質問がありました。私がやろうとしているのは、HTML テーブルからデータを読み取り、そのデータを という変数に取り込むことです$id。たとえば、次のコードがあります。

<tr>
<td>413</td>
<td>Party Hat</td>
<td>0</td>
<td>No</td>
<td><a href="http://clubpenguincheatsnow.com/tools/swfviewer/items.swf?id=413">View SWF</a></td>
</tr>

私がやりたいことは$array[$i]、検索クエリを保持している別の変数が呼び出されることです。その特定のクエリを含むセクションが見つかるまで、PHP コードでテーブルを検索する必要があります。この場合は「Party Hat」になります。クエリが見つかった後に実行したいことは、「Party Hat」という名前の上の「td」セクションである ID を調べることです。この場合の ID は 413 です。この後、変数 $id をIDを保持します。どうすればいいですか?どんな助けでも歓迎です!

4

3 に答える 3

3

TidyDOMDocument、およびDOMXPathを使用して (PHP 拡張機能が有効になっていることを確認してください)、次のようなことができます。

<?php
$url = "http://example.org/test.html";

function get_data_from_table($id, $url)
{
    // retrieve the content of that url
    $content = file_get_contents($url);

    // repair bad HTML
    $tidy = tidy_parse_string($content);
    $tidy->cleanRepair();
    $content = (string)$tidy;

    // load into DOM
    $dom = new DOMDocument();
    $dom->loadHTML($content);

    // make xpath-able
    $xpath = new DOMXPath($dom);

    // search for the first td of each tr, where its content is $id
    $query = "//tr/td[position()=1 and normalize-space(text())='$id']";
    $elements = $xpath->query($query);
    if ($elements->length != 1) {
        // not exactly 1 result as expected? return number of hits
        return $elements->length;
    }

    // our td was found
    $element = $elements->item(0);

    // get his parent element (tr)
    $tr = $element->parentNode;
    $data = array();

    // iterate over it's td elements
    foreach ($tr->getElementsByTagName("td") as $td) {
        // retrieve the content as text
        $data[] = $td->textContent;
    }

    // return the array of <td> contents
    return $data;
}

echo '<pre>';
print_r(
    get_data_from_table(
        414,
        $url
    )
);
echo '</pre>';

HTML ソース (http://example.org/test.html):

<table><tr>
<td>413</td>
<td>Party Hat</td>
<td>0</td>
<td>No</td>
<td><a href="http://clubpenguincheatsnow.com/tools/swfviewer/items.swf?id=413">View SWF</a></td>
</tr><tr>
<td>414</td>
<td>Party Hat</td>
<td>0</td>
<td>No</td>
<td><a href="http://clubpenguincheatsnow.com/tools/swfviewer/items.swf?id=413">View SWF</a></td>
</tr>

(ご覧のとおり、有効な HTML はありませんが、これは問題ではありません)

于 2012-05-21T17:27:32.273 に答える
2

これはうまくいきます:(少し醜いですが、おそらく他の誰かがより良いxpathソリューションを思い付くことができます)

$html = <<<HTML
<html>
    <body>
        <table>
            <thead>
                <tr>
                    <td>id</td>
                    <td>name</td>
                    <td>a</td>
                    <td>b</td>
                    <td>c</td>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>413</td>
                    <td>Party Hat</td>
                    <td>0</td>
                    <td>No</td>
                    <td>a link</td>
                </tr>
                <tr>
                    <td>414</td>
                    <td>Party Hat 2</td>
                    <td>0</td>
                    <td>No</td>
                    <td>a link</td>
                </tr>
            </tbody>
        </table>
    </body>
</html>
HTML;

$doc = new DOMDocument();
$doc->loadHTML($html);
$domxpath = new DOMXPath($doc);

$res = $domxpath->query("//*[local-name() = 'td'][text() = 'Party Hat']/../td[position() = '1']");

var_dump($res->length, $res->item(0)->textContent);

出力:

int(1)
文字列(3) "413"

于 2012-05-21T17:22:08.947 に答える
0

loadHTMLを介してhtmlを新しいDOMDocumentにロードし、xpathまたは他のタイプのクエリを使用してXMLドキュメントのように処理してみてください

于 2012-05-21T17:01:21.690 に答える