如何在已解析的HTML数据中查找元素

时间:2016-10-05 06:37:06

标签: php html xpath domdocument

在这里,我有一个非常简单的代码来抓住所有' div'具有classname' info_block'的元素。我想知道如何使用类名'价格'来寻找另一个元素?来自' info_block'并显示它而不是整个' info_block'元件。 主要目标:使用classname' info_block'查找每个元素的价格。但是在 foreach 中进行,因为我可能需要找到其他元素。

<?php
$page = file_get_contents('example.com');
$dom = new DOMDocument();
$dom->loadHTML($page);
$xpath = new DOMXPath($dom); 
$div1 = $xpath->query('//div[@class="info_block"]'); 
foreach ($div1 as $var1){
//echo $dom->saveHTML($var1); 
}
?>

每个&#39; info_block&#39;中都有一个元素。使用类名&#39;价格&#39;我想只显示那个元素。像这样......

   foreach ($div1 as $var1){ 
          $dom2 = new DOMDocument();
          $dom2->loadHTML($dom->saveHTML($var1));
          $xpath2 = new DOMXPath($dom2); 
          $div2 = $xpath2->query('//div[@class="price"]'); 
          $div2 = $div2->item(0);
    echo $dom2->saveHTML($div2);
   }

但是,不仅仅是给我价格,它还会返回&#39; info_block&#39;的整个HTML。就像以前一样。

3 个答案:

答案 0 :(得分:2)

您可以通过在<div class="info_block">的第二个参数中提供<div class="price">"来提供找到的每个->query()并搜索$div1 = $xpath->query('//div[@class="info_block"]'); foreach ($div1 as $var1){ $div2 = $xpath->query('./div[@class="price"]', $var1); // ^ each div $div2 = $div2->item(0); echo $dom->saveHTML($div2); }

DOM

注意:您无需创建DOMXpath<div class="info_block"> // each info block <div class="price">1</div> // inside of it has price </div> <div class="info_block"> <div class="price">2</div> </div> 的其他实例。

此示例涉及此类HTML语义的上下文:

SELECT ab.id, ab.name, creditAmt, debitAmt, creditAmt-debitAmt balance FROM ab
            JOIN (select sum(credit_amt) creditAmt from pq) i
            JOIN (select sum(debit_amt) debitAmt from pq) e
            WHERE ab.type = 'user' GROUP BY ab.user_eid

答案 1 :(得分:1)

您可以在XPath中组合查询,以便一次性找到所有需要的元素

$xpath->query('//div[@class="info_block"]|//div[@class="price"]'); 

答案 2 :(得分:1)

您可以指定用于执行相对XPath查询的dom元素。它在xpath->query方法

中是可选的
<?php
$page = file_get_contents('example.com');
$dom = new DOMDocument();
$dom->loadHTML($page);
$xpath = new DOMXPath($dom); 
$div1 = $xpath->query('//div[@class="info_block"]'); 
foreach ($div1 as $var1){
  $div2 = $xpath2->query('//a[@class="price"]', $var1); 
  foreach ($div2 as $var2) {
    echo $var2->nodeValue. "\n";
  } 
}
?>

有关详细信息,请参阅此处的xpath文档 xpath query documentation