从HTML表格列中提取数据

从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[]'); 

但它不能显示任何数据!

明天

+0

似乎存在一些错误:您无法从表2中获取“Data_Text” - 它没有包含此类字符串值的文本节点。请修改并更正。 – 2012-04-29 04:21:43

后,我将提供赏金一天这个问题,使用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查询。

我包含标签tabletbody,只是为了让这个例子更像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"