Текущая ситуация :
Я пытаюсь проанализировать DomDocument с XPath, результатом должен быть массив с категориями и подкатегориями.
Проблема в том, что человек, создавший HTML, не структурировал информацию с подкатегориями в основных категориях, они просто разграничены чистым CSS.
HTML выглядит следующим образом:
<div class="menu_item">Main Category AC</div>
<div class="submenu_div">
<a href="http://www.link.com/313">
<div class="sub_item">
<h3>Sub Categ A</h3>
</div>
</a>
<a href="http://www.link.com/475">
<div class="sub_item">
<h3>Sub Categ B</h3>
</div>
</a>
<a href="http://www.link.com/321">
<div class="sub_item">
<h3>Sub Categ C</h3>
</div>
</a>
</div>
<div class="menu_item">Main Category BC</div>
<div class="submenu_div">
<a href="http://www.link.com/313">
<div class="sub_item">
<h3>Sub Categ X</h3>
</div>
</a>
<a href="http://www.link.com/475">
<div class="sub_item">
<h3>Sub Categ Y</h3>
</div>
</a>
<a href="http://www.link.com/321">
<div class="sub_item">
<h3>Sub Categ Z</h3>
</div>
</a>
</div>
Теперь, с помощью этого php я могу извлечь категории и подкатегории, но это просто список, я не знаю, что подкатегория в какой категории, и я застрял.
Как я могу использовать Xpath для извлечения подкатегорий основной категории и назначения родителя для каждой подкатегории?
$doc = new DomDocument;
@$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
foreach( $xpath->query('//div[@class="menu_item"]|//div[@class="submenu_div"]/a/div/h3') as $e ) {
echo $e->nodeValue, "<br />\n";
}
Это эскиз для решения с использованием XPath. Внешний цикл ищет категории и печатает их. Он также отслеживает положение внешнего div
в переменной $i
, Внутренний цикл создает другой XPath, который выбирает $i
-м div
тег, затем переходит к следующему брату и, наконец, спускается к тексту подкатегории.
Обратите внимание, что вам все еще нужно хранить эти данные в соответствующей структуре данных. Я не знаком с PHP, поэтому не могу вам чем-то помочь.
$i = 0;
foreach( $xpath->query('//div[@class="menu_item"]/text()') as $category ) {
$i = $i + 1;
echo "Category: " . $category->nodeValue . "\n";
foreach ( $xpath->query('//div[@class="menu_item"][' . $i . ']/following-sibling::div[1][@class="submenu_div"]/a/div/h3/text()') as $subcategory) {
echo " Subcategory: " . $subcategory->nodeValue . "\n";
}
}
Основываясь на ответе выше, я сделал несколько модификаций, чтобы включить цикл for, а также получить ссылку:
for ($i = 0; $i <= 25; $i++) {
foreach( $xpath->query('//div[@class="menu_item"]['.$i.']/text()') as $category ) {
echo $i . " Category: " . $category->nodeValue . "<br/>\n";
foreach ( $xpath->query('//div[@class="menu_item"][' . $i . ']/following-sibling::div[1][@class="submenu_div"]/a') as $subcategory) {
echo '-----'. $i . " Subcategory: " . $subcategory->nodeValue . "<br/>\n";
echo '-----'. $i . " Link: " . $subcategory->getAttribute("href") . "<br/>\n";
}
echo "<br/>";
}
}
еще раз спасибо Маркус Риккерт!