PHP DOM ПОЛУЧИТЬ АТРИБУТ HREF МЕЖДУ ТАБЛИЦЕЙ - PullRequest
1 голос
/ 14 июля 2020

Я пытаюсь получить несколько 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 />';
   } 
?>

Я получаю эту ошибку

Неустранимая ошибка: Неперехваченная ошибка: вызов функции-члена getElementsByTagName () на null

getAttribute вызывает ошибку

Может ли кто-нибудь помочь мне здесь, пожалуйста, спасибо

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Ваш $rows является результатом «всего <tr> в пределах <table>». Он не только поймал <tr> в теле таблицы, но и поймал его в заголовке таблицы, в котором нет <td>. Следовательно, при чтении этой строки $cols->item(0) и $cols->item(1) оба получили NULL.

Вы должны понять подсказку, когда ваш код не нашел атрибут ->nodeValue в элементах (следовательно, вы добавили @, чтобы подавить предупреждение).

Попробуйте заменить это:

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

на это:

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

Теперь он ищет <tr> в вашем <tbody> и должен исправить вашу проблему с этим конкретным HTML.

Чтобы иметь более надежный код, вы должны были проверить переменные, прежде чем действовать с ними. Подойдет проверка типа или подсчета.

1 голос
/ 14 июля 2020

Поскольку при предыдущем доступе к массиву $cols все имели @ для подавления ошибок, это первое, что жалуется.

Простое исправление - просто пропустить остальную часть кода если элементы <td> не найдены (например, строка заголовка) ...

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

В качестве альтернативы вы можете использовать XPath и выбирать только теги <tr>, которые содержат теги <td>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...