如何在PHP中从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>
我想获得数据&amp;来自 3表的 Data_Text或(Data_Text_1&amp; 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[]');
但它无法显示任何数据!
我会在后天为这个问题提供赏金
答案 0 :(得分:1)
使用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;
}
?>
答案 1 :(得分:0)
给出一个名为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);
你得到这个输出:
string(4)&#34; DATA&#34;
string(9)&#34; Data_Text&#34;
string(4)&#34; Data&#34;
string(11)&#34; Data_Text_1&#34;
string(11)&#34; Data_Text_2&#34;
string(4)&#34; DATA&#34;
string(9)&#34; Data_Text&#34;
我没有理解你的问题,所以我做了这个例子,以显示你的表所有的文本节点。如果您只对某些节点感兴趣,则应选择执行该任务的XPath查询。
我添加了代码table
和tbody
,只是为了让示例更像HTML。
答案 2 :(得分:0)
使用此单个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表达式并输出所选文本节点(两次 - 作为评估结果一次,它们显示连接,第二次每个选定节点在单独的行上输出并被引号括起来:
DATAData_TextDataData_Text_1Data_Text_2DATAData_Text
。 。 。 。 。 。
"DATA"
"Data_Text"
"Data"
"Data_Text_1"
"Data_Text_2"
"DATA"
"Data_Text"