2012-04-29 5 views
1

Как извлечь данные из таблицы HTML в 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> 

Я хочу, чтобы получить данных & Data_Text или (Data_Text_1 & Data_Text_2) из 3 таблиц.
Я использовал

$html = file_get_contents($link); 
$doc = new DOMDocument(); 
@$doc->loadHTML($html); 
$xpath = new DOMXPath($doc); 
$nodes = $xpath->query('//td[]'); 
$nodes2 = $xpath->query('//td[]'); 

Но не могу показать любые данные!

Я предложу Баунти на этот вопрос на послезавтра

+0

Возможно, существует некоторая ошибка: вы не можете получить '' Data_Text "из таблицы 2 - он не имеет текстового узла с таким строковым значением. Пожалуйста, отредактируйте и исправьте. –

ответ

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

?> 

или использовать '' тд ...

<?php 

include 'simple_html_dom.php'; 

$html = file_get_html('thetable.html'); 

$cells = $html->find('td'); 
foreach($cells as $cell) { 
    echo $cell->plaintext; 
} 

?> 
0

Учитывая HTML-документ под названием xpathTables.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) " Данные "
строка (11)" Data_Text_1 "
строка (11)" Data_Text_2 "
строка (4)" DATA "
строка (9) «Data_Text»

я не понял, а на ваш вопрос, поэтому я сделал этот пример, чтобы показать все текстовые узлы, чтобы ваши таблицы были. Если вас интересуют только некоторые из этих узлов, вы должны выбрать запросы XPath, которые выполняют эту работу.

Я включил теги table и tbody, просто чтобы сделать пример более похожим на 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 вычисляется и выбранные текстовые узлы выход (дважды - один раз в результате оценки, и они кажутся сцепленными, второй раз ch выбранный узел выводится на отдельной линии и окружен кавычками):

DATAData_TextDataData_Text_1Data_Text_2DATAData_Text 

. , , , , , ,

"DATA" 

"Data_Text" 

"Data" 

"Data_Text_1" 

"Data_Text_2" 

"DATA" 

"Data_Text" 
Смежные вопросы