从HTML表格列中提取数据
问题描述:
如何从PHP中的HTML表格提取数据。该数据是在该格式从HTML表格列中提取数据
表1
<tr><td class="body" valign="top"><a href="example"><b>DATA</b></a></td><td class="body" valign="top">Data_Text</td></tr>
表2
<tr><th><div id="Data">Data</div></th><td>Data_Text_1</td><td>Data_Text_2</td></tr>
表3
<tr><td width="120"><a href="example" target="_blank">DATA</a></td><td>Data_Text</td></tr>
我想从3个表得到数据 & Data_Text或(Data_Text_1 & Data_Text_2)。
我用
$html = file_get_contents($link);
$doc = new DOMDocument();
@$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$nodes = $xpath->query('//td[]');
$nodes2 = $xpath->query('//td[]');
但它不能显示任何数据!
明天
答
后,我将提供赏金一天这个问题,使用simplehtmldom.php ...
<?php
include 'simple_html_dom.php';
$html = file_get_html('thetable.html');
$rows = $html->find('tr');
foreach($rows as $row) {
echo $row->plaintext;
}
?>
,或者使用 'TD' ......
<?php
include 'simple_html_dom.php';
$html = file_get_html('thetable.html');
$cells = $html->find('td');
foreach($cells as $cell) {
echo $cell->plaintext;
}
?>
答
鉴于一个叫做xpathTables.html
的HTML文档是这样的:
<html>
<body>
<table>
<tbody>
<tr><td class="body" valign="top"><a href="example"><b>DATA</b></a></td><td class="body" valign="top">Data_Text</td></tr>
</tbody>
</table>
<table>
<tbody>
<tr><th><div id="Data">Data</div></th><td>Data_Text_1</td><td>Data_Text_2</td></tr>
</tbody>
</table>
<table>
<tbody>
<tr><td width="120"><a href="example" target="_blank">DATA</a></td><td>Data_Text</td></tr>
</tbody>
</table>
</body>
</html>
而这个PHP脚本:
<?php
$link = "xpathTables.html";
$html = file_get_contents($link);
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$tables = $doc->getElementsByTagName('table');
$nodes = $xpath->query('.//tbody/tr/td/a/b', $tables->item(0));
var_dump($nodes->item(0)->nodeValue);
$nodes = $xpath->query('.//tbody/tr/td[@class="body"]', $tables->item(0));
var_dump($nodes->item(1)->nodeValue);
$nodes = $xpath->query('.//tbody/tr/th/div[@id="Data"]', $tables->item(1));
var_dump($nodes->item(0)->nodeValue);
$nodes = $xpath->query('.//tbody/tr/td', $tables->item(1));
var_dump($nodes->item(0)->nodeValue);
$nodes = $xpath->query('.//tbody/tr/td', $tables->item(1));
var_dump($nodes->item(1)->nodeValue);
$nodes = $xpath->query('.//tbody/tr/td/a', $tables->item(2));
var_dump($nodes->item(0)->nodeValue);
$nodes = $xpath->query('.//tbody/tr/td', $tables->item(2));
var_dump($nodes->item(1)->nodeValue);
你得到这样的输出:
串(4) “DATA”
字符串(9) “Data_Text”
串(4)“数据“
string(11)”Data_Text_1“
string(11)”Data_Text_2“
string(4)”DATA“
字符串(9)“Data_Text”
我不明白你的好问题,所以我做了这个例子,以显示所有文本节点的表了。如果您只对这些节点中的某些节点感兴趣,则应该选择执行该工作的XPath查询。
我包含标签table
和tbody
,只是为了让这个例子更像HTML。
答
使用此单个XPath表达式:
/*/table/tr//text()[normalize-space()]
这里选择不仅包括ODF空白字符任何文本节点,这是任何tr
元件是一个table
的子的后代元素是文档顶部元素的子元素。
XSLT - 基于验证:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/table/tr//text()[normalize-space()]"/>
. . . . . . .
<xsl:for-each select=
"/*/table/tr//text()[normalize-space()]">
"<xsl:copy-of select="."/>"
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
当该变换是针对下面的XML文档应用:
<html>
<table>
<tr>
<td class="body" valign="top">
<a href="example">
<b>DATA</b>
</a>
</td>
<td class="body" valign="top">Data_Text</td>
</tr>
</table>
<table>
<tr>
<th>
<div id="Data">Data</div>
</th>
<td>Data_Text_1</td>
<td>Data_Text_2</td>
</tr>
</table>
<table>
<tr>
<td width="120">
<a href="example" target="_blank">DATA</a>
</td>
<td>Data_Text</td>
</tr>
</table>
</html>
XPath表达式求值和所选择的文本节点是输出(两次 - 一次作为评估的结果,它们出现连接,第二次ea ch选择的节点在单独的行上输出并用引号包围):
DATAData_TextDataData_Text_1Data_Text_2DATAData_Text
。 。 。 。 。 。 。
"DATA"
"Data_Text"
"Data"
"Data_Text_1"
"Data_Text_2"
"DATA"
"Data_Text"
似乎存在一些错误:您无法从表2中获取“Data_Text” - 它没有包含此类字符串值的文本节点。请修改并更正。 – 2012-04-29 04:21:43