这里我有一个非常简单的代码来获取所有的'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);
}
注意:不需要再创建DOM
和DOMXpath
实例。
这个例子是考虑到这种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查询文档