Display first 4 columns of external table

8 浏览
0 Comments

Display first 4 columns of external table

我正在使用Windows软件来组织一次旅行。这个程序会生成包含参与者排名的HTML页面,但这些页面相当丑陋,所以我正在构建一个围绕它的网站。\n为了显示前10名的排名,我需要从生成的HTML文件中选择前10名参与者,并将其放在我的网站上。\n为了做到这一点,我使用了以下代码:\n

// 获取p_rnk.htm中前10名的排名
$file_contents = file_get_contents('p_rnk.htm');
$start = strpos($file_contents, ''); 
// 获取结束位置
$i = 11;
while (strpos($file_contents, ''. $i .'', $start) === false){
   $i++;
}
$end = strpos($file_contents, ''. $i .'', $start);
$code = substr($file_contents, $start, $end); 
echo $code;

\n这样我就能让它工作了,只是最后3列(上一次排名、上升或下降和详细信息)是无用的信息。所以我想删除这些列,或者找到一种只选择和显示前4列的方法。\n我该如何处理这个问题?\n


\n

编辑

\n我调整了我的代码,并最后只输出了调整后的表格。\n

loadHTMLFile("p_rnk.htm");
$table = $DOM->getElementsByTagName('table')->item(0);
$rows = $table->getElementsByTagName('tr');
$cut_rows_after = 10;
$cut_colomns_after = 3;
$row_index = $rows->length-1;
while($row = $rows->item($row_index)) {
    if($row_index+1 > $cut_rows_after)
        $table->removeChild($row);
    else {
        $tds = $row->getElementsByTagName('td');
        $colomn_index = $tds->length-1;
        while($td = $tds->item($colomn_index)) {
            if($colomn_index+1 > $cut_colomns_after)
                $row->removeChild($td);
            $colomn_index--;
        }
    }
    $row_index--;
}
echo $DOM->saveHTML($table);
?>

0
0 Comments

问题的原因是想要显示外部表的前四列,但是目前的代码没有实现这个功能。解决方法是解析HTML文档并操作描述DOM的对象。通过使用各种选择器,可以轻松提取表格本身,并以更简单的方式获取前10条记录。此外,还可以使用removeChild方法从每行中删除不必要的子节点(td)。修改完成后,可以使用saveHTML方法输出结果的HTML。

以下是经过测试的代码示例,已经将列和行的数量分离为两个变量,可以根据需要进行调整。请仔细查看代码,您会注意到一些在您代码中缺失的细节(索引是0..999,而不是1..1000,这就是为什么出现了所有这些-1和+1的原因;最好减少索引而不是增加,因为这样您就不必关心删除后的编号变化;我还使用while而不是for循环,以免单独处理$rows->item($row_index) == null的情况):

loadHTMLFile("./table.html");
    $table = $DOM->getElementsByTagName('tbody')->item(0);
    $rows = $table->getElementsByTagName('tr');
    $cut_rows_after = 10;
    $cut_colomns_after = 4;
    $row_index = $rows->length-1;
    while($row = $rows->item($row_index)) {
        if($row_index+1 > $cut_rows_after)
            $table->removeChild($row);
        else {
            $tds = $row->getElementsByTagName('td');
            $colomn_index = $tds->length-1;
            while($td = $tds->item($colomn_index)) {
                if($colomn_index+1 > $cut_colomns_after)
                    $row->removeChild($td);
                $colomn_index--;
            }
        }
        $row_index--;
    }
    echo $DOM->saveHTML();
?>

如果页面不包含

,请使用存在的容器。例如,如果

元素位于

元素中,请使用$DOM->getElementsByTagName('table')而不是$DOM->getElementsByTagName('tbody')。

0