【问题标题】:XPath multiple query, parsing based on class and in orderXPath多重查询,按类按顺序解析
【发布时间】:2014-09-17 16:11:34
【问题描述】:

现状:

我正在尝试使用 XPath 解析 DomDocument,结果应该是包含 Categories 和 Subcategories 的数组。 问题是,制作 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,我可以提取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";     
    }

【问题讨论】:

  • 使用上述代码运行示例:ideone.com/imVRmd
  • 我猜这使用单个 XPath 会很困难。你愿意用两个吗?
  • 我会使用任何在这一点上有效的东西 .. 也许 xpath 不是最好的方法,但我会使用任何能完成工作的东西,因为我的头现在正在横向移动。
  • 我在这里,但似乎什么都没有,还没有完成:( ideone.com/4nuEnZ

标签: php parsing xpath


【解决方案1】:

这是使用 XPath 的解决方案的草图。外部循环查找类别并打印它们。它还跟踪变量$i 中外部div 的位置。内部循环构造另一个 XPath,它选择 $i'th 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";
  }

}

【讨论】:

  • 是的!是的!谢谢你 !就是这样!
【解决方案2】:

根据上面的答案,我做了一些修改,还包括了一个 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/>";

    }
}

再次感谢马库斯·里克特!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2017-03-02
    • 1970-01-01
    相关资源
    最近更新 更多