是否可以使用 Symfony Dom 爬虫通过正则表达式进行搜索?
Is it possible to search by regexp with Symfony Dom crawler?
Dom Crawler Component 是解析 html 内容的强大工具,在其文档中描述了基本选择(如 filter('body > p')
)或更复杂的 xpath,如 //span[contains(@id, "article-")]
是否可以通过正则表达式获取元素?也许类似的东西可用: filter('body')->filter('div.*-timeLabel-*')
?
是这样的吗?修改了应用匿名函数的文档中的示例之一。
$nodeValues = $crawler->filter('body')->each(function (Crawler $node, $i) {
// regex and return $node->attr('class')
});
我不确定,但我认为答案是肯定的,因为爬虫调用的过滤方法
CssSelectorConverter
的此方法,根据文档,您可以将表达式作为参数传递
/**
* Translates a CSS expression to its XPath equivalent.
*
* Optionally, a prefix can be added to the resulting XPath
* expression with the $prefix parameter.
*
* @param string $cssExpr The CSS expression
* @param string $prefix An optional prefix for the XPath expression
*
* @return string
*/
public function toXPath($cssExpr, $prefix = 'descendant-or-self::')
{
return $this->translator->cssToXPath($cssExpr, $prefix);
}
在 XPath 2.0 中,您可以使用匹配项:
$crawler->filterXPath("//div[matches(@id, '*-timeLabel-*')]");
但如果您没有可用的,最好的办法是尝试结合其他一些 XPath methods,例如,这应该可以解决您的问题:
$crawler->filterXPath("//div[contains(@id, '*-timeLabel-*')]");
Dom Crawler Component 是解析 html 内容的强大工具,在其文档中描述了基本选择(如 filter('body > p')
)或更复杂的 xpath,如 //span[contains(@id, "article-")]
是否可以通过正则表达式获取元素?也许类似的东西可用: filter('body')->filter('div.*-timeLabel-*')
?
是这样的吗?修改了应用匿名函数的文档中的示例之一。
$nodeValues = $crawler->filter('body')->each(function (Crawler $node, $i) {
// regex and return $node->attr('class')
});
我不确定,但我认为答案是肯定的,因为爬虫调用的过滤方法
CssSelectorConverter
的此方法,根据文档,您可以将表达式作为参数传递
/**
* Translates a CSS expression to its XPath equivalent.
*
* Optionally, a prefix can be added to the resulting XPath
* expression with the $prefix parameter.
*
* @param string $cssExpr The CSS expression
* @param string $prefix An optional prefix for the XPath expression
*
* @return string
*/
public function toXPath($cssExpr, $prefix = 'descendant-or-self::')
{
return $this->translator->cssToXPath($cssExpr, $prefix);
}
在 XPath 2.0 中,您可以使用匹配项:
$crawler->filterXPath("//div[matches(@id, '*-timeLabel-*')]");
但如果您没有可用的,最好的办法是尝试结合其他一些 XPath methods,例如,这应该可以解决您的问题:
$crawler->filterXPath("//div[contains(@id, '*-timeLabel-*')]");