2012-04-29 187 views
1

如何從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

回答

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; 
} 

?> 
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); 

你得到這樣的輸出:

串(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。

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表達式求值和所選擇的文本節點是輸出(兩次 - 一次作爲評估的結果,它們出現連接,第二次ea ch選擇的節點在單獨的行上輸出並用引號包圍):

DATAData_TextDataData_Text_1Data_Text_2DATAData_Text 

。 。 。 。 。 。 。

"DATA" 

"Data_Text" 

"Data" 

"Data_Text_1" 

"Data_Text_2" 

"DATA" 

"Data_Text"