通过Symfony Crawler获取第一级dom元素

时间:2015-11-10 13:11:21

标签: symfony xpath domcrawler

我正在使用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>标签的存在会产生一些逻辑。

2 个答案:

答案 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);
}