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


How to find element in already parsed HTML data

这里我有一个非常简单的代码来获取所有的'div'元素与classname 'info_block'。我想知道如何从'info_block'中找到classname 'price'的另一个元素,并显示它而不是整个'info_block'元素。Main Goal:查找类名为'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); 
}
?>

在每个'info_block'中都有一个类名为'price'的元素,我想只显示该元素。像这样…

   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);
   }

但是它不只是给我价格,而是像以前一样返回'info_block'的整个HTML。

您可以通过在->query()的第二个参数中提供找到的每个<div class="info_block">并搜索<div class="price">":

$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);
}

注意:不需要再创建DOMDOMXpath实例。

这个例子是考虑到这种HTML语义上下文中的:

<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>

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

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

可以指定进行相对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查询文档