Php XPath多重查询,基于类和顺序进行解析
当前情况: 我试图用XPath解析DomDocument,结果应该是一个包含类别和子类别的数组。 问题是,制作HTML的人并没有用主类别中的子类别来构造信息,它们只是由纯css分隔 html LOO如下所示:Php XPath多重查询,基于类和顺序进行解析,php,parsing,xpath,Php,Parsing,Xpath,当前情况: 我试图用XPath解析DomDocument,结果应该是一个包含类别和子类别的数组。 问题是,制作HTML的人并没有用主类别中的子类别来构造信息,它们只是由纯css分隔 html LOO如下所示: <div class="menu_item">Main Category AC</div> <div class="submenu_div"> <a href="http://www.link.com/313">
<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>
主要类别AC
主要类别BC
现在,使用这个php我可以提取de类别和子类别,但它只是一个列表,我不知道什么类别中有什么子类别,我被卡住了。
如何使用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";
}
$doc=新文档;
@$doc->loadHTML($html);
$xpath=新的DOMXPath($doc);
foreach($xpath->query('//div[@class=“menu_item”]][124;//div[@class=“submenu_div”]]/a/div/h3”)作为$e){
echo$e->nodeValue,“
\n”;
}
这是一个使用XPath的解决方案的草图。外部循环查找类别并打印它们。它还跟踪变量$i
中外部div
的位置。内部循环构造另一个XPath,选择$i
'thdiv
标记,然后转到下面的同级,最后下降到子类别文本
请注意,您仍然必须将此数据存储到适当的数据结构中。我不熟悉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/>";
}
}
对于($i=0;$i查询('//div[@class=“menu_item”]['.$i.]]/text()')作为$category){
echo$i.“类别:”$Category->nodeValue.“
\n”;
foreach($xpath->query('//div[@class=“menu\u item”]['.$i.]]/以下同级::div[1][@class=“submenu\u div”]]/a)作为$subcategory){
回显'-'.$i.“子类别:“.$Subcategory->nodeValue。”
\n”;
回显'-'.$i.''链接:“.$subcategory->getAttribute(“href”)。”
\n”;
}
回声“
”;
}
}
再次感谢马库斯·里克特 使用上面的代码运行示例:我想使用单个XPath很难做到这一点。你愿意用两个吗?我会用在这一点上有效的任何东西。。也许xpath不是最好的方法,但我会使用任何可以完成任务的方法,因为我的大脑现在正在侧着身子思考这个问题。我在这里,但似乎什么都没有,它还没有完成:(是的!!是的!谢谢!就是这样!