Получить элементы первого уровня от 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);
}