标记上可能存在也可能不存在的 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]");
我确信这很简单,但我正在努力做到正确。我有以下标记:
<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]");