0

我正在使用 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 请求应该如何防止处理子元素?

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>标签的存在进行一些逻辑。

4

2 回答 2

2

在您的特殊情况下,如果您只想要第一级div元素,您可以搜索任何上面没有任何 div 元素的元素:

"//div[not(.//ancestor::div)]"

此 xpath 将仅导致第一级div元素

请注意,此解决方案仅适用于您的示例。更困难的结构可能需要不同的解决方案。

于 2015-11-10T13:16:15.757 回答
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);
}
于 2015-11-10T13:16:05.307 回答