Symfony Dom Crawler Отсутствует узел, непоследовательное поведение - PullRequest
0 голосов
/ 02 ноября 2018

С этим кодом:

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 (PHARAGRAPH) не содержит иметь body в качестве родителя, но p

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

1 Ответ

0 голосов
/ 02 ноября 2018

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

Примечание

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

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

...