使用 JSDOM 将 HTML 表格转换为 PHP 数组

问题描述

我想把这个表格的 HTML 转换成 PHP 数组

the table

到目前为止我尝试过的:

<?PHP

function curl($url){
    $ch = curl_init(); 
    curl_setopt($ch,CURLOPT_URL,$url); 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
    $output = curl_exec($ch); 
    curl_close($ch);      
    return $output;
}

$html = curl('https://www.ortax.org/ortax/?mod=kursbi');

$data = array();
foreach((@DOMDocument::loadHTML($html))->getElementsByTagName("td") as $tag){
    $data[trim($tag->textContent)]=trim($tag->nextSibling->nextSibling->textContent);
}

echo '<pre>';
print_r($data);
echo '</pre>';

?>

我得到的结果: 这个错误

Notice: Trying to get property 'textContent' of non-object in D:\XAMPP\htdocs\curl\curl.PHP on line 16

和这个数组:

Array
(
    [] => Error Etax-40001
    [Planning SPT Tahunan: PPh 22,23,25 Lebih Bayar] => 
    [Kewajiban NIK Untuk Faktur Pajak] => 
    [Billing DJBC] => 
    [Bagaimana Cara Mengatasi E-Bupot PPh 23/26 Yang Error?] => 
    [Error Etax-40001] => 
    [Dolar Australia [ AUD ]] => 1
    [1] => 0.62
    [10850.85] => 10741.47
    [10741.47] => 10796.16
    [10796.16] =>
 ) 

我想要的结果是我只想要数字数组中的表格内容并摆脱上面的错误

Array
(
    [0] => Array
        (
            [0] => Dolar Australia [ AUD ]
            [1] => 1
            [2] => 10850.85
            [3] => 10741.47
            [4] => 10796.16
        )
)

解决方法

这是一个hacky的解决方案,但这应该有效。

从您得到的结果来看,您似乎选择了页面中存在的所有 <td>,您将获得不需要的数据。如果可能的话,最好只从您需要的特定表格中进行选择。

$table = @DOMDocument::loadHTML($html)->getElementsByTagName("table")->item(1);
$i=-1;
foreach($table->getElementsByTagName('tr') as $row){
    $j = 0;
    foreach($row->getElementsByTagName('td') as $tag){
        //echo $tag->textContent."<br>";
        $data[$i][$j] = $tag->textContent;
        $j++;
    }
    $i++;
}