我正在使用Symfony Crawler组件解析html,如下所示:
<div> //first level div
<div>1</div> //sub div
<div>2</div>
<div>
<div></div> // more levels and empty divs possible
</div>
</div>
<div>
<div>3</div>
<div>4</div>
</div>
值1 2 3 4可能会有所不同,甚至不存在于空div中,但div也可能包含subDivs等。我一直处于选择第一级div来处理它们的阶段。 Xpath请求返回第一级div和细分
$crawler = new Crawler($html);
foreach ($crawler->filterXPath('//div') as $domElement) {
var_dump($domElement->textContent);
}
返回
string(2) "12"
string(1) "1"
string(1) "2"
string(2) "34"
string(1) "3"
string(1) "4"
Xpath请求应如何防止处理subElements?
UPD:
实际麻烦DOM方案
<div> //first level div
<div>1</div> //sub div
<div>2</div>
</div>
<div>
<div>3</div>
<div>4
<div>5</div>
<a>6</a>
</div>
</div>
这个DOM树应该由第一级div处理,并且根据<a>
标签的存在会产生一些逻辑。
答案 0 :(得分:2)
在您的特殊情况下,如果您只想要第一级div
元素,则可以只搜索上面没有任何div元素的任何元素:
"//div[not(.//ancestor::div)]"
此xpath仅在第一级div
元素
请注意,此解决方案仅适用于您的示例。 更困难的结构可能需要不同的解决方案。
答案 1 :(得分:0)
试试这样:
$crawler = new Crawler($html);
foreach ($crawler->filterXPath('//div')->children() as $domElement) {
var_dump($domElement->textContent);
}
编辑:
在这种特定情况下,您应该尝试:
foreach ($crawler->filterXPath('//div/div') as $domElement) {
var_dump($domElement->textContent);
}