【问题标题】:PHP DOM GET HREF ATTRIBUTE BETWEEN TABLEPHP DOM 获取表之间的 HREF 属性
【发布时间】:2020-11-03 11:16:19
【问题描述】:

我正在尝试从这样的表中获取多个 href

<table class="table table-bordered table-hover">
   <thead>
      <tr>
         <th class="text-center">No</th>
         <th>TITLE</th>
         <th>DESCRIPTION</th>
         <th class="text-center"><span class="glyphicon glyphicon-download-alt"></span></th>
      </tr>
   </thead>
   <tbody>
    <tr data-key="11e44c4ebff985d08ca5313231363233">
       <td class="text-center" style="width: 50px;">181</td>
       <td style="width:auto; white-space: normal;"><a href="link-1.html">Link 1</a></td>
       <td style="width:auto; white-space: normal;">Lorem ipsum dolor 1</td>
       <td class="text-center" style="width: 50px;"><a href="link-1.pdf" title="Download" target="_blank"><img src="https://example.com/img/pdf.png" width="15" height="20" alt="myImage"></a></td>
    </tr>
    <tr data-key="11e44c4e4222d630bdd2313231323532">
       <td class="text-center" style="width: 50px;">180</td>
       <td style="width:auto; white-space: normal;"><a href="link-2.html">Link 2</a></td>
       <td style="width:auto; white-space: normal;">Lorem ipsum dolor 2</td>
       <td class="text-center" style="width: 50px;"><a href="link-2.pdf" title="Download" target="_blank"><img src="https://example.com/img/pdf.png" width="15" height="20" alt="myImage"></a></td>
    </tr>
    </tbody>
</table>

我尝试这样的 PHP DOM

<?php
$html = file_get_contents('data2.html');
 
$htmlDom = new DOMDocument;
$htmlDom->preserveWhiteSpace = false; 
$htmlDom->loadHTML($html);
$tables = $htmlDom->getElementsByTagName('table'); 
$rows = $tables->item(0)->getElementsByTagName('tr'); 

foreach ($rows as $row) 
  { 
      $cols = $row->getElementsByTagName('td'); 
      echo @$cols->item(0)->nodeValue.'<br />'; 
      echo @$cols->item(1)->nodeValue.'<br />'; 
      echo trim($cols->item(1)->getElementsByTagName('a')->item(0)->getAttribute('href')).'<br />';
      echo @$cols->item(2)->nodeValue.'<br />'; 
      echo trim($cols->item(3)->getElementsByTagName('a')->item(0)->getAttribute('href')).'<br />';
   } 
?>

我收到此错误

致命错误:未捕获的错误:在 null 上调用成员函数 getElementsByTagName()

getAttribute 导致错误

谁能帮帮我,谢谢

【问题讨论】:

  • 很明显,某些东西($tables-&gt;item(0) 或 $cols-&gt;item(1) 或 $cols-&gt;item(3))是 null。 var_dump 并检查。
  • 因为第一个tr 不包含任何td 标记(在thead 中)。
  • 这能回答你的问题吗? Reference - What does this error mean in PHP?
  • nodeValue 没问题,但无法获取 href 的属性
  • 会有所帮助,如果你能说,哪个 getElementsByTagName 导致错误

标签: php dom html-table attributes getelementsbytagname


【解决方案1】:

由于之前对$cols数组的访问都有@来抑制错误,这是第一个抱怨的。

如果没有找到&lt;td&gt; 元素(例如标题行),一个简单的解决方法是跳过其余代码...

foreach ($rows as $row)
{
    $cols = $row->getElementsByTagName('td');
    if ( count($cols) == 0 )    {
        continue;
    }

您也可以使用 XPath,只选择包含 &lt;td&gt; 标签的 &lt;tr&gt; 标签。

【讨论】:

    【解决方案2】:

    您的$rows 是“&lt;table&gt; 内的所有&lt;tr&gt;”的结果。它不仅捕获了表体中的&lt;tr&gt;,还捕获了您的表头中的那个,其中没有&lt;td&gt;。因此,当阅读该行时,$cols-&gt;item(0) 和 $cols-&gt;item(1) 都得到了你 NULL。

    当您的代码在项目中找不到-&gt;nodeValue 属性时,您应该接受提示(因此您添加了@ 符号来禁止警告)。

    尝试改变这一点:

    $rows = $tables->item(0)->getElementsByTagName('tr'); 
    

    进入这个:

    $rows = $tables
            ->item(0)->getElementsByTagName('tbody')
            ->item(0)->getElementsByTagName('tr');
    

    现在它正在搜索您的&lt;tbody&gt; 中的&lt;tr&gt;,应该可以解决您使用此特定 HTML 的问题。

    要获得更健壮的代码,您应该在对变量进行操作之前检查它们。类型检查或计数检查会很好。

    【讨论】:

      猜你喜欢
      • 2017-05-28
      • 2013-01-12
      • 2019-04-14
      • 2016-06-07
      • 2011-10-03
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      相关资源
      最近更新 更多