Получить элементы первого уровня от Symfony Crawler

Я использую компонент Symfony Crawler для анализа html следующим образом:

<div>              //first level div
    <div>1</div>   //sub div
    <div>2</div>
    <div>
      <div></div>  // more levels and empty divs possible
    </div>
</div>
<div>
    <div>3</div>
    <div>4</div>
</div>

Значения 1 2 3 4 могут различаться или даже не существовать в пустом div, но также div может содержать subDivs и т. Д. Я застрял на этапе выбора div первого уровня для их обработки. Запрос Xpath возвращает мне div первого уровня, а также subdivs

$crawler = new Crawler($html);
foreach ($crawler->filterXPath('//div') as $domElement) {
    var_dump($domElement->textContent);
 }

возвращается

 string(2) "12"
 string(1) "1"
 string(1) "2"
 string(2) "34"
 string(1) "3"
 string(1) "4"

Как должен выглядеть запрос Xpath для предотвращения обработки подэлементов?

UPD:
актуальная проблема DOM схема

<div>              //first level div
    <div>1</div>   //sub div
    <div>2</div>
</div>
<div>
    <div>3</div>
    <div>4
        <div>5</div>
        <a>6</a>
    </div>
 </div>

Это дерево DOM должно обрабатываться div первого уровня и в зависимости от наличия <a> тег делает некоторую логику.

2 ответа

В вашем особом случае, если вы хотите только первый уровень div элементы, вы можете просто искать любые элементы, которые не имеют элементов div над ними:

"//div[not(.//ancestor::div)]"

этот xpath приведет только к первому уровню div элементы

Помните, что это решение подходит только для вашего примера. Для более сложной структуры может потребоваться другое решение.

Попробуйте вот так:

$crawler = new Crawler($html);
foreach ($crawler->filterXPath('//div')->children() as $domElement) {
    var_dump($domElement->textContent);
}

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

В этом конкретном случае вы должны попробовать:

foreach ($crawler->filterXPath('//div/div') as $domElement) {
    var_dump($domElement->textContent);
}
Другие вопросы по тегам