2

私はこの問題についてこの質問を使用していました。 このテーブルを解析してデータを抽出するにはどうすればよいですか?

しかし、私が解析しようとしているテーブルで困惑しました。

これはPHPページのソースコードです。その中には、テーブルID「troops」という1つのテーブルしかありません。

配列のテーブルヘッダーを取得できましたが、行データをヘッダーに接続できません。

これは私が使用しているコードであり、上記の記事のために、私のニーズに合わせて編集されています。

htmlソースコード http://pastebin.com/RKbzVT1V

使用したphpコード

$content = $_POST['src'];
$dom = new DomDocument;
$dom -> loadHtml($content);

$xpath = new DomXPath($dom);

// collect header names

$headerNames = array();
foreach ($xpath->query('//table[@id="troops"]//th') as $node) {
//foreach ($xpath->query('//th[ contains (@class, "vil fc") ]') as $node) {
    $headerNames[] = $node -> nodeValue;

}

// collect data

$data = array();
foreach ($xpath->query('//tr') as $node) {
    $rowData = array();
    foreach ($xpath->query('//td', $node) as $cell) {
        $rowData[] = $cell -> nodeValue;
    }

    $data[] = array_combine($headerNames, $rowData);
}

より簡単な方法があれば、この問題に関する助けをいただければ幸いです。

4

1 に答える 1

2

コードを実行すると、次のようになります。

PHP 警告: array_combine(): 両方のパラメータに同じ数の要素が必要です

これは、 のアイテム数が のアイテム$headerNames数と等しくないことを意味し$rowDataます。行$rowDataのすべての TD 要素が含まれていますが、HTML を見ると、TH 要素よりも多くの TD 要素があることがわかります。

<tr class="hover">
 <th class="vil fc">
     <a href="build.php?newdid=3665&id=39#td">00 La piu …&lt;/a>
 </th>
 <td>54</td>
 <td>5</td>
 <td class="none">0</td>
 <td>74</td>
 <td>355</td>
 <td class="none">0</td>
 <td class="none">0</td>
 <td class="none">0</td>
 <td class="none">0</td>
 <td class="none">0</td>
 <td class="none lc">0</td>
</tr>

次のようなことを達成しようとしていると思います。

[00 La piu …] => Array
    (
        [0] => 54
        [1] => 5
        [2] => 0
        [3] => 74
        [4] => 355
        [5] => 0
        [6] => 0
        [7] => 0
        [8] => 0
        [9] => 0
        [10] => 0
    )

次のコードが生成します。

libxml_use_internal_errors(true);
$dom = new DOMDocument;
$dom->loadHTMLFile('NewHTMLFile.html');
$table = $dom->getElementById('troops');
foreach ($table->getElementsByTagName('tr') as $tr) {
    if ($header = $tr->getElementsByTagName('th')->item(0)) {
        $data[trim($header->nodeValue)] = array_map(
            function(DOMElement $td) { return $td->nodeValue; },
            iterator_to_array($tr->getElementsByTagName('td'))
        );
    }
}
libxml_use_internal_errors(false); 
print_r($data);

これが探しているものでない場合は、質問を更新して、取得しようとしている出力のサンプルを含めてください。

于 2013-01-30T18:38:30.097 に答える