PHP DOMXPath无法从通用html类中获取彼此相关的内容

时间:2018-02-13 11:51:56

标签: php html-parsing domxpath

我正在使用php DOMXPath解析html页面,并且我试图从类标签中获取与类别信息中的nodeValue对应的nodeValue。

<h3>
    <div class="metadata">
        <span class="label">Another Label</span>
        <span class="info">
            <a href="some-link.com">Link Name</a>
        </span>
    </div>
</h3>
<h3>
    <div class="metadata">
        <span class="label">Some Label</span>
        <span class="info">
            <a href="some-link.com">Link Name</a>, 
            <a href="another-link.com">Another Link Name</a>, 
            <a href="yet-another-link.com">Yet Another Link Name</a>
        </span>
    </div>
</h3>

我通过以下方式访问内容:

$label = $xpathLabel->query("//h3/div/span[@class='label']");
$info = $xpathInfo->query("//h3/div/span[@class='info']/a");

并输出:

foreach ($labels as $label) {
    print "{$label->nodeValue}\n";
    foreach($infos as $info){
        print "\t{$info->nodeValue}\n";
    }
}

哪个输出:

Another Label
    Link Name
    Link Name
    Another Link Name
    Yet Another Link Name
Some Label
   Link Name
   Link Name
   Another Link Name
   Yet Another Link Name

为什么会发生这种情况仍然有意义,因为查询是独立的,并且它们的输出都是来自类标签中的所有内容,而另一个内容都是类信息的内容。

是否有更好的方法来进行查询或以更好的方式输出可解决问题的内容?

1 个答案:

答案 0 :(得分:0)

您需要使用外部元数据 div作为循环的锚点,然后列出该元素中的标签和信息链接:

$metadata = $xpathLabel->query("//h3/div[@class='metadata']");

foreach ($metadata as $group) {
    $labels = $xpathLabel->query("./span[@class='label']", $group);

    foreach ($labels as $label) {
        print "{$label->nodeValue}\n";
    }

    $infos = $xpathLabel->query("./span[@class='info']/a", $group);

    foreach($infos as $info){
        print "\t{$info->nodeValue}\n";
    }
}

<div>元素用作$contextnode的{​​{1}}参数,仅搜索当前元素的子元素。

有关完整示例,请参阅https://eval.in/955491