我有以下代码尝试将unsigned int
元素1依次串行包含自己的标记而不包含任何html
和styles
。另外,我没有得到classes
images
但无论我做什么,当我在该页面中使用 $client = new Client();
$crawler = $client->request('GET', 'http://www.tutorialspoint.com/laravel/laravel_ajax.htm');
$crawler->filter('h1, h2, h3, h4, h5, h6, p, pre, p > img, div > img, p > a')->each(function(Crawler $node, $i){
if ($node->filter('p')){
echo $node->text()."<br/>";
} else if ($node->filter('pre')) {
echo '<code>'.$node->html().'</code><br/>';
}
});
时使用$node->text()
或该页面中的所有html时,我只会获得文字。
我试图以$node->html()
- p
为例。 <p>Text Here</p>
- img
。
答案 0 :(得分:2)
行$node->filter('p')
将始终返回true,因为函数filter
的返回值是Crawler
对象,因此第二个else if
从未调用过。
如果要检查爬网程序中是否包含节点,可以使用count()
函数。
至于你的代码 - 我不太确定为什么这就是你正在做的事情,但基本上你的代码所做的就是检查当前元素是否为<p>
子元素(这是你想要做的吗?),如果有 - 打印父节点文本的内容。
为了从Crawler($node
)获取节点DOMElement,您可以使用
$node->getNode(0)`
并使用此节点,您可以查看nodeName
(==代码名称),获取textContent
(代码内容)等。
以下是您可以使用的示例:
$crawler = $client->request('GET', 'http://www.tutorialspoint.com/laravel/laravel_ajax.htm');
$crawler->filter('h1, h2, h3, h4, h5, h6, p, pre, p > img, div > img, p > a')->each(function(Crawler $node, $i){
if (in_array($node->getNode(0)->nodeName, ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'a'])) {
echo "{$node->getNode(0)->nodeName} => {$node->getNode(0)->textContent}.<br/>\n";
} elseif ($node->getNode(0)->nodeName == 'pre') {
echo "pre => <code>".$node->html()."</code><br/>\n";
} elseif ($node->getNode(0)->nodeName == 'img') {
echo 'img => src="'.$node->getNode(0)->getAttribute('src')."\" <br/>\n";
}
});