You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将CoinMarketCap上的BNB历史价格表格数据转为CSV格式?

如何将抓取的BNB历史价格表格转为CSV格式?

问题背景

你已经用simple_html_dom成功抓取了CoinMarketCap上BNB的历史价格表格,但当前代码直接提取了表格的纯文本,所有数据挤成一串,无法直接用作CSV格式。你的目标是将表格中的每一行、每一列数据正确分隔,生成标准的CSV文件。

解决方案

当然可以实现!核心思路是不要直接提取整个表格的纯文本,而是遍历表格的每一行和每个单元格,逐个获取数据后按照CSV规则拼接。同时要注意处理带逗号的数值(比如成交量、市值),避免CSV解析错误。

以下是完整的改进代码:

require_once('simple_html_dom.php');

// 目标页面URL
$url = "https://coinmarketcap.com/currencies/binance-coin/historical-data/?start=20180101&end=20180519";
$html = file_get_html($url);

// 定位到历史数据表格
$table = $html->find('#historical-data .table', 0);
if (!$table) {
    die("错误:未能找到目标历史数据表格");
}

// 存储CSV每行内容的数组
$csvRows = [];

// 遍历表格的每一行(包括表头)
foreach ($table->find('tr') as $row) {
    $currentRowCells = [];
    // 遍历当前行的每个单元格(表头用<th>,数据用<td>)
    foreach ($row->find('td, th') as $cell) {
        // 去除单元格文本前后的多余空格
        $cellContent = trim($cell->plaintext);
        
        // 处理带逗号的数值(如成交量、市值):用双引号包裹,避免CSV将逗号识别为分隔符
        if (strpos($cellContent, ',') !== false && is_numeric(str_replace(',', '', $cellContent))) {
            $currentRowCells[] = "\"$cellContent\"";
        } else {
            $currentRowCells[] = $cellContent;
        }
    }
    // 将当前行的所有单元格用逗号连接,加入CSV行数组
    $csvRows[] = implode(',', $currentRowCells);
}

// 将所有行拼接成完整的CSV字符串
$csvContent = implode("\n", $csvRows);

// 选项1:直接输出CSV,让浏览器触发下载
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="bnb_historical_data_2018.csv"');
echo $csvContent;

// 选项2:保存CSV到本地文件(取消注释即可使用)
// file_put_contents('bnb_historical_data_2018.csv', $csvContent);

代码关键点说明

  • 逐元素抓取:通过遍历<tr>和<td>/<th>,精准获取每个单元格的数据,避免了纯文本拼接的混乱
  • CSV格式兼容:对包含逗号的数值用双引号包裹,确保CSV解析器能正确识别这些数值为单个字段,不会出现列错位
  • 灵活性:提供两种输出方式——直接让用户下载,或者保存到本地文件,可按需选择
  • 错误处理:加入了表格不存在的判断,避免空指针错误

内容的提问来源于stack exchange,提问作者ShittyDeveloper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:40:54