2015-11-10 7 views
0

Я использую компонент Symfony Гусеничный для разбора HTML, как это:Получить первые элементы уровня Dóm по Symfony Crawler

<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 и т. д. Я застрял на этапе выбора разделов первого уровня для их обработки. запрос Xpath вернуть мне первый уровень дивы, а также сабдивами

$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 дерево должно быть обработана первыми дивами уровня и в зависимости от наличия <a> тега делает некоторую логику.

+0

что именно вы хотите распечатать? – drkthng

+0

Мне нужно обработать каждый div первого уровня для его содержимого, но я все еще получаю все элементы DIV из дерева DOM, включая subLevels. Решение, подобное «//div[./div]», неприменимо, так как некоторые поддивы также могут иметь DIV в нем. – Tesmen

+0

Наконец, я хотел бы преобразовать этот DOM в конкретный массив для дальнейших логических манипуляций. – Tesmen

ответ

0

Try так:

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

EDIT:

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

foreach ($crawler->filterXPath('//div/div') as $domElement) { 
    var_dump($domElement->textContent); 
} 
+0

Это будет выводить только 1 2 без 3 4 как $ crawler-> filterXPath ('// div') -> children(), но, как бы то ни было, идея близка к решению. – Tesmen

1

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^