使用 Goutte 连续抓取图像、链接和文本
Scrape Images, Links and Texts serially using Goutte
我有下面的代码试图将 html
元素 1 个 1 个连续地包含它自己的标签,而没有任何 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()
时我只会收到文本,或者当我在该页面中使用 $node->html()
时我会收到该页面中的所有 html。
我试图获得例如 p
- <p>Text Here</p>
。 img
- <img src="default.jp"/>
.
行 $node->filter('p')
将始终 return 为真,因为函数 filter
的 returned 值是一个 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";
}
});
我有下面的代码试图将 html
元素 1 个 1 个连续地包含它自己的标签,而没有任何 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()
时我只会收到文本,或者当我在该页面中使用 $node->html()
时我会收到该页面中的所有 html。
我试图获得例如 p
- <p>Text Here</p>
。 img
- <img src="default.jp"/>
.
行 $node->filter('p')
将始终 return 为真,因为函数 filter
的 returned 值是一个 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";
}
});