gpt4 book ai didi

php - 在 HTML 中获取低于先前结果的 DOMXpath 结果

转载 作者:搜寻专家 更新时间:2023-10-31 21:38:21 24 4
gpt4 key购买 nike

我正在尝试对外部网站的 HTML 进行分类,不幸的是,该网站的组织非常糟糕。数据可能看起来像这样:

<a class="title">Title One</a>
<a class="item">Item One</a>
<a class="item">Item Two</a>

<a class="title">Title Two</a>
<a class="item">Item One</a>
<a class="item">Item Two</a>

我正在为标题使用这样的 xpath 查询:

$titles = $x->evaluate('//a[@class="title"]');

现在,我想列出标题及其下方的项目。不幸的是,这些元素都没有方便地包装在父 div 中,所以我不能只过滤父 div 中的所有内容。所以,我对项目使用这样的查询:

$titles = $x->evaluate('//a[@class="item"]');

理想情况下,我只想检查当前标题元素下方的结果。所以,如果我循环并点击“标题一”,我只想检查出现在标题一和标题二之间的“项目”结果。有什么办法吗?

修改 HTML 不是这里的选项。我知道这个问题有点荒谬,我的解释可能很糟糕,但如果有解决方案,那真的对我有帮助!

谢谢大家

最佳答案

可以先找到title元素,然后使用->nextSibling()继续前进:

$html =<<<EOM
<a class="title">Title One</a>
<a class="item">Item One</a>
<a class="item">Item Two</a>

<a class="title">Title Two</a>
<a class="item">Item One</a>
<a class="item">Item Two</a>
EOM;

$d = new DOMDocument;
$d->loadHTML($html);
$x = new DOMXPath($d);
foreach ($x->query('//a[@class="title"]') as $node) {
echo "Title: {$node->nodeValue}\n";
// iterate the siblings
while ($node = $node->nextSibling) {
if ($node->nodeType != XML_ELEMENT_NODE) {
continue; // skip text nodes
}
if ($node->getAttribute('class') != 'item') {
// no more .item
break;
}
echo "Item: {$node->nodeValue}\n";
}
}

输出:

Title: Title One
Item: Item One
Item: Item Two
Title: Title Two
Item: Item One
Item: Item Two

关于php - 在 HTML 中获取低于先前结果的 DOMXpath 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13925494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com