Получить текст элемента, используя DOM с PHP, но вернуть ошибку

Схожу с ума не могу понять почему не работает...

У меня есть эта веб-страница с этим html:

<table>
  <tbody>
    <tr><tr>
    <tr>
        <td> 
            <table class = "style124">
                <tbody>
                    <tr>
                        <td>A</td>
                    </tr>
                    <tr>
                        <td>B</td> //THIS !!
                    </tr>
                </tbody>
            </table>
        </td>
    </tr>
    <tr></tr>
  </tbody>
</table>

я хочу напечатать текст внутри <td> с комментарием («Это»), и я пытаюсь:

$vuoto= $dom-> getElementsByClassName('style124') -> getElementsByTagName('tbody') -> getElementsByTagName('tr')[1] -> getElementsByTagName('td') ->textContent;
echo $vuoto;

но у меня есть эта ошибка:

Неперехваченная ошибка: вызов неопределенного метода DOMDocument::getElementsByClassName()

РЕДАКТИРОВАТЬ

 $url = "https://www.nihilscio.it/Manuali/Lingua%20latina/Verbi/Coniugazione_latino.asp?verbo=fero1+&lang=IT_";


$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17');
curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);

$html = curl_exec($ch);
$dom = new DOMDocument();

// set error level
$internalErrors = libxml_use_internal_errors(true);

$dom->loadHTML($html);
// Restore error level
libxml_use_internal_errors($internalErrors);

РЕДАКТИРОВАТЬ 2

    <body>
      Il sito è in manutenzione,
      <a href = "../../../Posta/contatti.asp?testoerrore=fero1 /">segnalateci</a> eventuali errori.

      <table>
        <!-- INIZIO TABELLA PRINCIPALE-->
        <tbody>
          <tr>
            <td style = "height: 34px">
              Buona navigazione con NihilScio!&nbsp;&nbsp;<a target = "_blank" href = "https://www.facebook.com/NihilScio/"><img src = "https://www.nihilscio.it/images/fb.jpg" alt = "Pagina facebook"></a>

            </td>
          </tr>

          <tr>
            <td class = "style105">
              <!--title = "Herculaneum (Ercolano) - bassorilievo"-->
              <br>

              <span class = "style112"><em>NS NihilScio</em></span>
              <br><a>Educational search engine</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href = "../../../index.asp">Home</a>
            </td>
          </tr>

          <tr>
            <td>

              <table cellspacing = "0" cellpadding = "0">


                <tbody>
                  <tr>
                    <td>

                      <form name = "uscita">

                        <table class = "style123" cellspacing = "0" cellpadding = "0">

                          <tbody>
                            <tr>
                              <td style = "height: 22px">
                                Coniugazione/declinazione
                              </td>
                              <td style = "height: 22px">
                              </td>

                            </tr>

                            <tr title = "Per favore non utilizzare caratteri accentati o speciali">
                              <td>
                                <input type = "text" id = "verbo" name = "verbo" value = "fero1 " size = "60" style = "font-size: 16pt; width: 200px">
                                <!--    <input type = "submit" onclick = "javascript:validainput()" value = "&gt;&gt;" style = "font-size: 14pt; width: 37px; background-color: #6699cc; color:blue; height: 25px;"/>&nbsp; -->
                                <input type = "submit" onclick = "speciali(' ')" value = " >> " style = " width: 40px;  height: 28px;  font-size:large; background-color:#99CCFF;  ">
                                <br>
                                <a onclick = "speciali('á')"> <span>á&nbsp;&nbsp;&nbsp;&nbsp;</span> </a>
                                <a onclick = "speciali('é')"> <span>é&nbsp;&nbsp;&nbsp;&nbsp;</span> </a>
                                <a onclick = "speciali('è')"> <span>è&nbsp;&nbsp;&nbsp;&nbsp;</span> </a>
                                <a onclick = "speciali('ì')"> <span>ì&nbsp;&nbsp;&nbsp;&nbsp;</span> </a>
                                <a onclick = "speciali('í')"> <span>í&nbsp;&nbsp;&nbsp;&nbsp;</span> </a>
                                <a onclick = "speciali('ò')"> <span>ò</span> </a><br><br>
                                <a onclick = "speciali('ó')"> <span>ó&nbsp;&nbsp;&nbsp;&nbsp;</span> </a>
                                <a onclick = "speciali('ù')"> <span>ù&nbsp;&nbsp;&nbsp;&nbsp;</span> </a>
                                <a onclick = "speciali('ú')"> <span>ú&nbsp;&nbsp;&nbsp;&nbsp;</span> </a>
                                <a onclick = "speciali('ü')"> <span>ü&nbsp;&nbsp;&nbsp;&nbsp;</span> </a>
                                <a onclick = "speciali('ñ')"> <span>ñ&nbsp;&nbsp;&nbsp;&nbsp;</span> </a>
                                <a onclick = "speciali('ç')"> <span>ç</span> </a>


                              </td>
                              <td>

                                <a href = "Coniugazione_latino.asp?verbo=fero1 &amp;lang=EN_"> English</a>

                              </td>
                            </tr>

                            <tr>

                              <td title = "Questa opzione è necessaria solo quando il vocabolo (non latino) da cercare  può essere confuso con parole latine" style = "height: 21px; ">
                                Traduci in Latino
                                <input type = "checkbox" name = "tradinv" value = "1">


                              </td>
                              <td style = "height: 21px">

                                <a href = "Coniugazione_latino.asp?verbo=fero1 &amp;lang=ES_">Español</a>
                              </td>
                            </tr>

                            <tr>

                              <td style = "height: 22px; " valign = "bottom"><span class = "HTML_TAG">


                                  It<input type = "radio" name = "lang" value = "IT_" checked = "checked">

                                  En<input type = "radio" name = "lang" value = "EN_">

                                  Es<input type = "radio" name = "lang" value = "ES_">



                                </span>
                              </td>
                              <td style = "height: 22px">

                                <img alt = "Versione italiana" src = "https://www.nihilscio.it/Ita.png">Italiano

                              </td>
                            </tr>

                          </tbody>
                        </table>
                      </form>

                    </td>
                  </tr>

                </tbody>
              </table>

            </td>
          </tr>
          <tr>
            <td>
              <!--style = "height: 136px>------ SECONDA RIGA T. P. -->
              <button id = "frasi" onclick = "javascript:PopupCentrata1('https://www.nihilscio.it/NS/EstraiFrasiClassici.asp?verbo=fero1 /&amp;verboconsel=&amp;lang0=IT_&amp;lang=LT_')" class = "style119"> Vocabolari e frasi</button>
              <!--  <table cellspacing = "0"> -->
            </td>
          </tr>

          <tr>
            <td>
              <table class = "style124">
                <tbody>
                  <tr>
                    <td><span class = "HTML_TAG">Vocaboli trovati: </span></td>
                  </tr>
                  <!--<td></td></tr> -->

                  <tr>
                    <td>

                    </td>
                    <!--<td title = "">more...</td> -->
                  </tr>

                </tbody>
              </table>
            </td>
          </tr>

            

    <tr><td>
        
        <span class = "style13"> fero1:</span>
        <span class = "HTML_ELM">vocabolo non trovato.</span><a href = "../../../Posta/contatti.asp?testoerrore=fero1 /">Comunica errori</a>
        

    </td></tr>
    <tr><td>
        La parola non è ancora in archivio.<br>Grazie per averla cercata<br>Riprova più tardi<br>Si raccomanda di non utilizzare segni di punteggiatura e caratteri speciali e di scrivere al massimo 5 parole interspaziate.<br>es.: puella a bonis pueris amata est <br>In caso di errore ci scusiame e la preghiamo di <a href = "../../../Posta/contatti.asp?testoerrore=fero1 /">comunicarcelo.</a>
      
    </td></tr>


         <tr><td>
        <a href = "https://www.nihilscio.it/nihilscio.asp?cat=Latino&amp;keyw=fero1 /" class = "HTML_ELM">
        <span class = "style43"><strong>Continua la ricerca sul web con NihilScio</strong></span></a>
        </td></tr>
        
    <tr><td><span><em>NS-NihilScio</em>©2009-2020</span></td></tr>
    </tbody></table>
                


    <script type = "text/javascript">


    function Popup(apri)
    {

    var asse_x = event.clientX;
        var asse_y = event.clientY;
        
     var stile = "top = "+asse_y + ",left = "+asse_x + ",width=250, height=30, lacation=no, status=no, menubar=no, toolbar=no, scrollbars=no";
       
    let newWin = window.open("", "traduzione", stile  ); /*"width=200,height=200"); about:blank*/
    /*newWin.document.write("Hello, world!"); */
    /*let newWin = window.open("traduzione", "hello", "width=200,height=200");*/

    newWin.document.write(apri); 
    //newWin.close();
     /* window.open(apri, "", stile);*/
    }

            
    function PopupCentrata1(apri)
        {
        var w = 900;
        var h = 350;
        document.getElementById("frasi").innerHTML = '<iframe' + ' src=' + '"' + apri + '"' + ' width=' + w  + ' height=' + h + '></iframe>'; //"\"" + + "\"" 
        }


    function visualizzatuttoatt0() {
        document.getElementById("ConCompAtt0").innerHTML =  "";
        }
            
    function visualizzatuttopass0() {
        document.getElementById("ConCompPass0").innerHTML =  "";
        }
            
    function visualizzatuttoatt1() {
        document.getElementById("ConCompAtt1").innerHTML =  "";
        }

    function visualizzatuttopass1() {
        document.getElementById("ConCompPass1").innerHTML = "";
        }
                
    function visualizzatuttoatt2() {
        document.getElementById("ConCompAtt2").innerHTML = "";
        }
                
    function visualizzatuttopass2() {
        document.getElementById("ConCompPass2").innerHTML = "";
        }
                
    function visualizzatuttoatt3() {
        document.getElementById("ConCompAtt3").innerHTML =  "";
        }
                
    function visualizzatuttopass3() {
        document.getElementById("ConCompPass3").innerHTML =  "";
        } 
        </script>  


        
    <script type = "text/javascript">
    function speciali(lettera) {
    document.uscita.verbo.value+= lettera;
    document.uscita.verbo.focus();
    };
    </script>

    </body>

Где вы видели getElementsByClassName?

user3783243 15.12.2020 13:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
198
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет функции getElementsByClassName. Вы можете перебрать все элементы определенного типа с помощью https://www.php.net/manual/en/domdocument.getelementsbytagname.php , а затем проверить их класс на наличие указанного значения, https://www. php.net/manual/en/domelement.getattribute.php. В качестве альтернативы вы можете использовать xpath.

$html = '<table>
  <tbody>
    <tr><tr>
    <tr>
        <td> 
            <table class = "style124">
                <tbody>
                    <tr>
                        <td>A</td>
                    </tr>
                    <tr>
                        <td>B</td> //THIS !!
                    </tr>
                </tbody>
            </table>
        </td>
    </tr>
    <tr></tr>
  </tbody>
</table>';
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$query = '//table[contains(@class, "style124")]/tbody/tr[2]/td';
$entries = $xpath->query($query);
foreach($entries as $entry){
    echo $entry->nodeValue;
}

https://3v4l.org/pDFhB

Кроме того, getElementsByTagName возвращает набор результатов, вы не просто получите к нему доступ с помощью ->, вам нужно будет указать, что вы хотите.

Альтернативным подходом может быть:

$html = '<table>
  <tbody>
    <tr><tr>
    <tr>
        <td> 
            <table class = "style124">
                <tbody>
                    <tr>
                        <td>A</td>
                    </tr>
                    <tr>
                        <td>B</td> //THIS !!
                    </tr>
                </tbody>
            </table>
        </td>
    </tr>
    <tr></tr>
  </tbody>
</table>';
$dom = new DOMDocument;
$dom->loadHTML($html);
$tables = $dom->getElementsByTagName('table');
foreach($tables as $table){
    if (preg_match('/\bstyle124\b/', $table->getAttribute('class'))){
        $trs = $table->getElementsByTagName('tr');
        $tds = $trs[1]->getElementsByTagName('td');
        echo $tds[0]->nodeValue;
    }
}

обратите внимание на разницу в базовом индексе между PHP и xpath, $trs[1] и tr[2].

https://3v4l.org/hLEFV

Я использую ваш первый метод и работает! но если <td> пуст, как я могу это узнать?

Borja 15.12.2020 13:45

@Borja Нравится 3v4l.org/Gpaq9 или 3v4l.org/Nfr7a?

user3783243 15.12.2020 13:47

ааа только пусто :D я попробовал strlen ...большое спасибо !

Borja 15.12.2020 13:48

Можно также использовать trim, если просто пробел также недействителен. 3v4l.org/h0H8q

user3783243 15.12.2020 13:50

ничего... не работает :( этот html находится внутри веб-страницы, и я пытался использовать ваш код, но ничего.... это веб-страница: nihilscio.it/Manuali/Lingua%20latina/Verbi/…

Borja 15.12.2020 14:08

Не знаю, что делать с этой ссылкой. Что здесь выполняет PHP-код?

user3783243 15.12.2020 14:15

Я пытаюсь разобрать эту веб-страницу (для перевода на латинский язык)... ваш код работает в вашем примере, но если я использую $html, URL-адрес страницы не работает

Borja 15.12.2020 14:17

я добавляю код в редактирование

Borja 15.12.2020 14:20
$dom->loadHTML($html); правда?
user3783243 15.12.2020 14:23

Что вы имеете ввиду под истинным? Первый раз, когда я пытаюсь разобрать веб-страницу с помощью php

Borja 15.12.2020 14:24
var_dump($dom->loadHTML($html));
user3783243 15.12.2020 14:35

да вернуть bool(true)

Borja 15.12.2020 14:40

так в чем проблема :(

Borja 15.12.2020 14:40

Вам нужно будет отладить. Что-то не то. var_dump($entries->length); дает 1 или 0?

user3783243 15.12.2020 14:50

int(0) .... что случилось?

Borja 15.12.2020 18:14

Таким образом, HTML не то же самое. Что есть в HTML?

user3783243 15.12.2020 18:43

я добавляю во втором РЕДАКТИРОВАТЬ полный html...

Borja 15.12.2020 19:18

проблема в "tbody" но я не понимаю почему... в html он есть но ваш код работает только без tbody

Borja 15.12.2020 20:06

JavaScript с HTML вызывает проблемы с синтаксическим анализом. Если вы можете разобрать без JS, он работает так, как ожидалось. Некоторые способы удаления скрипта можно посмотреть здесь, stackoverflow.com/questions/40703313/…

user3783243 15.12.2020 21:10

Другие вопросы по теме