PHP получение текста и Href с HTML-страницы с помощью XPATH

#php #html #domxpath

#php #HTML #domxpath

Вопрос:

Это мой первый вопрос в Stack, поэтому простите меня, если что-то не так.

У меня есть веб-страница, на которой есть список информации, которую я хотел бы извлечь, также есть в одном из td, но я не могу понять, как получить к нему доступ.

Пример HTML:

 <tbody>
  <tr>
   <td>
     19-10-2020 @ 17:33
   </td>
   <td class="hidden-xs hidden-sm">
    <a href="#" data-identifier="5f8db1c332ea9b22d375b7c0"></a>                                       
   </td>
  

Вот пример PHP, который я использовал для извлечения других TD

 $xpath = new DOMXpath($document);
        
        foreach($xpath->evaluate('//table/tbody/tr') as $tr) {
    

enter code here

        
            $i = 0;
            $row = [];
            foreach ($xpath->evaluate('td', $tr) as $td) {
                if ($i == 0){
                    $row['datumtijd'] = date_format(date_create(str_replace(" @", "",trim($td->nodeValue))),"Y-m-d H:i:s");
                }
                if ($i == 1){
                  print_r($td->nodeValue); //Completely empty
                }
  

Любая помощь действительно ценится.

Комментарии:

1. Стоит проверить источник вашей обработки (т. Е. html, загруженный в ваш php-код). Иногда поиск в браузере для проверки структуры может ввести в заблуждение (я думаю, что Chrome <tbody> иногда добавляет теги).

2. Какую именно информацию вы пытаетесь извлечь?

3. Мне нравится получать дату, идентификатор данных и другие текстовые поля, которые я не включил в пример

Ответ №1:

Сосредоточив внимание только на извлечении данных (а не на форматировании и т. Д.) И предполагая, что ваш html исправлен, как показано ниже, Попробуйте что-то вроде:

  $str = '
<tbody>
  <tr>
   <td>
     19-10-2020 @ 17:33
   </td>
   <td class="hidden-xs hidden-sm">
    <a href="#" data-identifier="5f8db1c332ea9b22d375b7c0"></a>                                       
   </td>
  </tr>
</tbody>
';
$doc = new DOMDocument();
$doc->loadHTML($str);
$doc = simplexml_import_dom($doc);
$dates = $doc->xpath('//td[1]');
$identifiers = $doc->xpath('//td/a[@href]/@data-identifier');

foreach(array_combine($dates, $identifiers) as $date => $identifier) {
    echo trim($date) . "n";
    echo trim($identifier) . "n";
}
  

Вывод:

 19-10-2020 @ 17:33
5f8db1c332ea9b22d375b7c0
  

Ответ №2:

Есть простой способ получить n-й элемент с помощью php без xpath:

 $dom = new DOMDocument();
@$dom->loadHTML($HTML);
foreach($dom->getElementsByTagName('table') as $table) {
  echo innerHTML($table->getElementsByTagName('td')->item(ITEM_NUMBER))
}