标记上可能存在也可能不存在的 Goutte 选择器

Goutte Selectors on Markup that may or may not be present

我确信这很简单,但我正在努力做到正确。我有以下标记:

<div id="container">
   <h3>Instructions</h3>
   <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
   <h3>Directions</h3>
   <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
   <h3>Warnings</h3>
   <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</div>

这三个元素中的任何一个都可能丢失,它们可以按任何顺序排列,我希望能够使用 goutte 提取 p 标签中的文本并知道我正在处理哪个。

我试过以下变体但没有成功:

$node->filter('div#container h3')->each(function (Crawler $node) {
   switch ($node->text() {
      case 'Instructions':
         //$instructions = $node->filter('p')->text();
         //$instructions = $node->closest('p')->text();
         $instructions = $node->parents()->filter('p')->text()
      break;
    //etc....
   }
});

我也尝试过使用 xpath 来获取前兄弟姐妹,但无法按照

的方式尝试正确的事情
$node->filterXPath("/div[preceding-sibling::h3[normalize-space() = 'Instructions']]");

each循环中,为什​​么在参数中使用“crawler”?你只需要给 $node 函数,我认为这是问题!!

Crawler 似乎无法遍历到元素的下一个直接同级元素,因此您可能需要使用 XPath。使用带有 [position() = 1] 谓词的 following-sibling:: 轴将其限制为仅在您想要的 h3 之后的下一个 p:

$node->filterXPath("/div/h3[normalize-space() = 'Instructions']/following-sibling::p[position() = 1]");