Fellas!
У меня есть одна неприятная страница для синтаксического анализа, но не могу понять, как извлечь из нее правильные блоки данных, используя Simple HTML DOM , потому что у нее нет поддержки селектора дочерних элементов CSS.
HTML:
<ul class="ul-block"> <li>xxx</li> <li>xxx</li> <li> <ul> <li>xxx2</li> </ul> </ul>
Как я могу извлечь (прямые) дочерние элементы li
родительского ul.ul-block
?
$node->find('ul[class=ul-block] > li');
не работает и $node->find('ul[class=ul-block] li');
ofc находит также вложенные элементы descandant li
🙁
Простой пример с 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 />'; }
У меня была такая же проблема, и я использовал метод children, чтобы захватить только элементы первого уровня.
<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>
И вот код Simple HTML Dom для получения только элементов li первого уровня:
$html = file_get_html( $url ); $first_level_items = $html->find( '.my-list', 0)->children(); foreach ( $first_level_items as $item ) { ... do stuff ... }