2015-11-10 46 views
0

我使用的Symfony履帶組件來解析HTML這樣的:由Symfony的履帶獲取第一級DOM元素

<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等我被困在選擇第一級divs處理它們的階段。 Xpath的要求返回我第一個層次的div也細分值

$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>標籤的存在,使得一些邏輯。

+0

你想要打印什麼? – drkthng

+0

我需要爲它的內容處理每個firstLevel div,但我仍然從DOM樹中接收到所有DIV元素,包括subLevels。像「//div[./div]」這樣的解決方案是不適用的,因爲一些子div也可以有DIV。 – Tesmen

+0

最後,我想將這個DOM轉換爲特定的數組,以進一步進行邏輯操作。 – Tesmen

回答

0

嘗試這樣的:

$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); 
} 
+0

這將只輸出1 2沒有3 4作爲$ crawler-> filterXPath('// div') - > children(),但是我想這個想法已經接近解決方案。 – Tesmen

1

在你的特殊情況下,如果你只是想第一級div元素,您可以搜索任何沒有任何div元素的元素:

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

這個XPath將導致僅在第一級div元素

當心,這種解決方案只適用於你的榜樣不錯。 更困難的結構可能需要不同的解決方案。