Symfony Dom Crawler Отсутствует узел, непоследовательное поведение

С этим кодом:

use Symfony\Component\DomCrawler\Crawler;
require_once(__DIR__ . '/../vendor/autoload.php');

$html = <<<'HTML'
<!DOCTYPE html>

<html>
<body>
<p class="message">Hello World!</p>
<p>Hello Crawler!</p>
<p>OUTSIDE
<span>
Child SPAN
</span>
<div>
Child DIV
</div>
<p>
Child PARAGRAPH
</p>
</p>
</body>
</html>

HTML;

$crawler = new Crawler($html);
$crawlerFiltered = $crawler->filter('body > p');

$results = [];
$childResults = [];
for ($i=0; $i<count($crawlerFiltered); $i++) {
$results[] = $crawlerFiltered->eq($i)->html();

$children = $crawlerFiltered->eq($i)->children();
if (count($children)) {
for ($j=0; $j<count($children); $j++) {
$childResults[] = $children->eq($j)->html();
}
}
}

echo 'Parent Nodes:' . PHP_EOL;
var_export($results);
echo PHP_EOL;
echo 'Child Nodes:' . PHP_EOL;
var_export($childResults);

Я получаю результат:

Parent Nodes:
array (
0 => 'Hello World!',
1 => 'Hello Crawler!',
2 => 'OUTSIDE
<span>
Child SPAN
</span>
',
3 => '
Child PARAGRAPH
',
)
Child Nodes:
array (
0 => '
Child SPAN
',
)

Это представляет следующие проблемы:

  1. Дочерний результат: нет DIV или P (только встроенные теги)
  2. Родительский результат: PHARAGRAPH без тега, несовместим с SPAN
  3. Родительский результат: должен содержать только первый p потому что второй p (ФАРАГРАФ) не
    иметь body как родитель, но p

Знаете ли вы, почему это так и как решить проблемы, как указано выше?

1

Решение

Документация для этого компонента состояния:

Заметка

DomCrawler попытается автоматически исправить ваш HTML, чтобы соответствовать официальной спецификации. Например, если вы вложите <p> тег внутри другого <p> тег, он будет перемещен, чтобы быть родным тегом родительского тега. Это ожидается и является частью спецификации HTML5.

Вам может повезти, используя встроенный DomDocument классы. Большинство анализаторов HTML предназначены для работы с «суп метки» и постараюсь исправить возникшие проблемы.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector