2011-07-26 11 views
2

フェラ!シンプルなHTML DOMを使って子セレクタを模倣する方法は?

私は1つの厄介なページを解析していますが、CSS子セレクタサポートがないため、Simple HTML DOMを使用して正しいデータブロックを抽出する方法を理解できません。

HTML:

<ul class="ul-block"> 
    <li>xxx</li> 
    <li>xxx</li> 
    <li> 
     <ul> 
     <li>xxx2</li> 
     </ul> 
</ul> 

どのように私は親ul.ul-blockの(直接の)子li要素を抽出しますか?

$node->find('ul[class=ul-block] > li');は動作しないと$node->find('ul[class=ul-block] li'); OFCは、ネストされたdescandantにもli要素:(

+2

*シンプルなHTML DOM *を使用することに依存していますか? [SimpleXML](http://php.net/manual/book.simplexml.php)や[php DOM](http://www.php.net/manual/book.dom.php)をご覧になっていない場合は、 。両方とも、xpathクエリを使用することができ、子要素のみを選択することに問題はありません。 – Yoshi

+0

@Yoshiねえ、私はかなり依存していない、私は他のウェブサイトの廃棄に使用しているが、なぜ私は他のパーサーを追加できなかったのか分からない。提案ありがとう。 – arma

答えて

2

簡単な例php DOMで見つけた:私は同じ問題を持っていた、とつかむために子供メソッドを使用

$dom = new DomDocument; 
$dom->loadHtml(' 
<ul class="ul-block"> 
    <li>a</li> 
    <li>b</li> 
    <li> 
     <ul> 
     <li>c</li> 
     </ul> 
    </li> 
</ul> 
'); 

$xpath = new DomXpath($dom); 
foreach ($xpath->query('//ul[@class="ul-block"]/li') as $liNode) { 
    echo $liNode->nodeValue, '<br />'; 
} 
6

を最初のレベルの項目だけです。

<ul class="my-list"> 
    <li> 
     <a href="#">Some Text</a> 
     <ul> 
      <li><a href="#">Some Inner Text</a></li> 
      <li><a href="#">Some Inner Text</a></li> 
      <li><a href="#">Some Inner Text</a></li> 
      <li><a href="#">Some Inner Text</a></li> 
     </ul> 
    </li> 
    <li> 
     <a href="#">Some Text</a> 
     <ul> 
      <li><a href="#">Some Inner Text</a></li> 
      <li><a href="#">Some Inner Text</a></li> 
      <li><a href="#">Some Inner Text</a></li> 
      <li><a href="#">Some Inner Text</a></li> 
     </ul> 
    </li> 
</ul> 

最初のレベルのアイテムを取得する:

$html = file_get_html($url); 
$first_level_items = $html->find('.my-list', 0)->children(); 

foreach ($first_level_items as $item) { 
    ... do stuff ... 
}