【问题标题】:Extract data from HTML table row column从 HTML 表格行列中提取数据
【发布时间】:2012-05-09 07:21:33
【问题描述】:

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

我想从 3 个表格 中获取 DataData_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[]');

但它不能显示任何数据!

我会在后天悬赏这个问题

【问题讨论】:

  • 似乎有一些错误:您无法从表 2 中获取"Data_Text" -- 它没有具有此类字符串值的文本节点。请编辑并更正。

标签: php regex dom xpath


【解决方案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;
}

?>

【讨论】:

    【解决方案2】:

    给定一个名为 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)“数据”
    字符串(9)“数据文本”
    字符串(4)“数据”
    字符串 (11) "Data_Text_1"
    字符串 (11) "Data_Text_2"
    字符串(4)“数据”
    string(9) "Data_Text"

    我没有很好地理解您的问题,所以我制作了这个示例以显示您的表格具有的所有文本节点。如果您只对其中一些节点感兴趣,您应该选择能够完成这项工作的 XPath 查询。

    我添加了标签tabletbody,只是为了使示例更像HTML。

    【讨论】:

      【解决方案3】:

      使用这个单一的 XPath 表达式

      /*/table/tr//text()[normalize-space()]
      

      这将选择任何文本节点,它不仅包含 odf 空白字符,而且是任何 tr 元素的后代,该元素是 table 元素的子元素,而 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"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-22
        • 1970-01-01
        • 2012-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多