Вопрос по php, simple-html-dom – глюк <tbody> в PHP Простой HTML DOM парсер

7

Я использую PHP Simple HTML DOM Parser для очистки некоторых данных интернет-магазина (также использую XAMPP 1.7.2 с PHP5.3.0), и у меня возникают проблемы с<tbody> тег. Структура таблицы очень важна (детали не так уж и важны):

<table>
  <thead>
    <!--text here-->
  </thead>
  <tbody>
    <!--text here-->
  </tbody>
</table>

Теперь я пытаюсь добраться до<tbody> раздел с помощью кода:

$element = $html->find('tbody',0)->innertext;

Он не выдает никаких ошибок, он просто ничего не печатает, когда я пытаюсь повторить его. Я проверил код на других элементах,<thead>, <table>ещё что-то вроде<span class="price"> и все они работают нормально (конечно, удаление ", 0" приводит к сбою кода). Все они дают свои правильные разделы. Внешний текст то же самое. Но все это терпит неудачу на<tbody>.

Теперь я пролистал парсер, но не уверен, что смогу разобраться. Я заметил что<thead> даже не упоминается, но работает нормально.пожимание плечами

Я думаю, что я мог бы попытаться сделать детскую навигацию, но это, кажется, сбой также. Я только что попытался запустить:

$el = $html->find('table',0);
$el2 = $el->children(2);
echo $el2->outertext;

и никаких кубиков. Попробовал заменитьchildren с участиемfirst_child и 2 с 1, и до сих пор нет кости. Забавно, правда, если я попробую->find вместоchildrenработает отлично.

Я вполне уверен, что смог бы обойти все это, но такое поведение кажется достаточно странным, чтобы публиковать здесь. Мой любопытный ум рад за любую помощь, которую он может получить.

Ваш Ответ

4   ответа
3

http://sourceforge.net/p/simplehtmldom/bugs/79/

Это все еще открыто во время этого письма. Существует альтернативное исправление, если вы не хотите изменять исходный код, например, в цикле, чтобы найти<tr>«s

<?php
  // The *BROKEN* way to find the <tr>'s 
  // below the <tbody> below the <table id="foo">
  foreach($dom->find('tbl#foo tbody tr') as $tr) {
    /* you will get nothing */
  }

Вместо этого вы можете выборочно проверять имя родительского тега во время итерациивсе <tr>вот так:

<?php
  // A workaround to find the <tr>'s 
  // below the <tbody> below the <table id="foo">
  foreach($dom->find('tbl#foo tr') as $tr) { // note the lack of tbody selector
    /* you will get all trs, but let's only work with ones with the parent
       of a tbody! */
    if($tr->parent->tag == 'tbody') { // our workaround
      /* this part will work as you would expect the above broken code to work */
    }
  }

Также обратите внимание на немного не связанную проблему, с которой я столкнулся: инспекторы Chrome и FF исправят теговый суп в отношении<tbody> а также<thead>, Будьте осторожны - смотрите только на действительный источник - держитесь подальше от инспекторов DOM, если у вас возникнут необъяснимые проблемы.

Вы спасли моего ночного человека. Я не знаю, почему вы не получаете никакого удара, но без файла помощника изменения, ваше решение является лучшим. Благодарю. MERT DOĞAN
29

в файле simple_html_dom.php прокомментируйте или удалите строку # 396

// if ($m[1]==='tbody') continue;
К вашему сведению: в версии1.11 (Rev. 184) этот код находится на линии629. h2ooooooo
это должно быть упомянуто в документации>: ( user669677
В версии 1.5 (редакция 196) код находится в строке 695 Corné Guijt
В версии 1.5 (редакция 210) код находится в строке701 user3189338
В версии 1.5 (редакция X) код находится в строке Ctrl + F "if ($ m [1] === 'tbody') continue;" Kevin Gagnon
1

tbody исходит из некоторого исполнения JavaScript. Я столкнулся с той же проблемой с тегом span. Позже я обнаружил, что если любой html-код попадает на страницу через jquery / любое другое выполнение javascript, то в этом случаеsimple_html_dom просто терпит неудачу.

0

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

Похожие вопросы