如何解析该表并从中提取数据?

Posted

技术标签:

【中文标题】如何解析该表并从中提取数据?【英文标题】:How to parse this table and extract data from it? 【发布时间】:2011-10-12 16:45:16 【问题描述】:

我有下表:http://www.nbs.rs/kursnaListaModul/srednjiKurs.faces?lang=lat

这是一个货币兑换清单,我需要从中提取一些数据。表格左侧是货币 ID 号。是否可以根据 ID 从指定行中提取数据?

例如,从上表中,我想提取 ID 为 978、203 和 348 的货币。

输出应该是:

104,2182 欧元 4,2747 捷克克朗 匈牙利福林 38,7919

通过查看此处的类似示例,我想出了这个:http://pastebin.com/hFZs1H7C

我需要以某种方式检测 ID 和打印正确的值...在编程方面我是菜鸟,我需要你的帮助。

<?php
$data = file_get_contents('http://www.nbs.rs/kursnaListaModul/srednjiKurs.faces?lang=lat');

$dom = new domDocument;

@$dom->loadhtml($data);
$dom->preserveWhiteSpace = false;
$tables = $dom->getElementsByTagName('table');

$rows = $tables->item(1)->getElementsByTagName('tr');

foreach ($rows as $row) 
        $cols = $row->getElementsByTagName('td');
                foreach ($cols as $col) 

                                echo $col;

                


?>

【问题讨论】:

【参考方案1】:

将表格数据收集为数组以备后用:

$dom = new DomDocument;
$dom->loadHtmlFile('http://www.nbs.rs/kursnaListaModul/srednjiKurs.faces?lang=lat');

$xpath = new DomXPath($dom);

// collect header names
$headerNames = array();
foreach ($xpath->query('//table[@id="index:srednjiKursLista"]//th') as $node) 
    $headerNames[] = $node->nodeValue;


// collect data
$data = array();
foreach ($xpath->query('//tbody[@id="index:srednjiKursLista:tbody_element"]/tr') as $node) 
    $rowData = array();
    foreach ($xpath->query('td', $node) as $cell) 
        $rowData[] = $cell->nodeValue;
    

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


print_r($data);

输出

Array
(
    [0] => Array
        (
            [ŠIFRA VALUTE] => 978
            [NAZIV ZEMLJE] => EMU
            [OZNAKA VALUTE] => EUR
            [VAŽI ZA] => 1
            [SREDNJI KURS] => 104,2182
        )

    ...
)

示例用法:

foreach ($data as $entry) 
    printf(
        '%s %s' . PHP_EOL,
        $entry['OZNAKA VALUTE'],
        $entry['SREDNJI KURS']
    );

【讨论】:

很棒很棒很棒!!!效果很好,我添加了第二个带有货币代码的数组,然后比较这两个数组并使用精美的国家图标创建表格:D @Destruct 如果这对您有用,请查看How does accepting an answer work? ;)【参考方案2】:

您可以使用 PHP 的 xpath 和 domdocument 功能从 html(或 xml)中提取特定数据。

$src = new DOMDocument('1.0', 'utf-8');
$src->formatOutput = true;
$src->preserveWhiteSpace = false;
$content = file_get_contents("http://www.nbs.rs/kursnaListaModul/srednjiKurs.faces?lang=lat");
@$src->loadHTML($content);
$xpath = new DOMXPath($src);
$values=$xpath->query('//td[ contains (@class, "tableCell") ]');
foreach($values as $value)

echo $value->nodeValue."<br />";

这将打印每个带有 class="tableCell" 的 td 元素的 innerHTML。

【讨论】:

以上是关于如何解析该表并从中提取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字典存储到我的解析仪表板中并从中提取数据(Swift 3)

如何将下拉列表选定的数据传递到另一个表并在 asp.Net MVC 中更新该表

使用 AJAX 解析从 ASP 页面返回的 HTML 表并提取特定单元格

处理 ResultProxy 对象

我们如何以编程方式读取、解析 autocad .dwg 文件并从中提取信息?

index日期取数