Я использую 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, и все еще не first_child
кости. Забавно, хотя, если я попытаюсь ->find
вместо children
, он отлично работает.
Я довольно уверен, что могу найти работу вокруг всего, но это поведение кажется довольно странным, чтобы публиковать здесь. Мой любопытный ум рад за всю помощь, которую он может получить.
в файле simple_html_dom.php или удалите строку # 396
// if ($m[1]==='tbody') continue;
Для этой проблемы есть отчет об ошибке: 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, если вы столкнетесь с необъяснимыми проблемами.
Удостоверьтесь, что ваш твой результат исходит от выполнения javascript. Я столкнулся с той же проблемой с тегом span. Позже я обнаружил, что если какой-либо html-код попадает на страницу через jquery / любое другое выполнение javascript, тогда в этом случае simple_html_dom
просто терпит неудачу.
Удостоверьтесь, что tbody действительно есть. Многие браузеры будут добавлять tbody к таблицам в панели проверки, даже если они не присутствуют в ответе.