如何解析该表并从中提取数据?
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 表并提取特定单元格