Последовательно очищайте изображения, ссылки и тексты с помощью 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(), либо весь html на этой странице, когда я использую $node->html() на этой странице.

Я пытаюсь получить, например, p - <p>Text Here</p>. img - <img src="default.jp"/>.


person Xahed Kamal    schedule 08.08.2016    source источник


Ответы (1)


Строка $node->filter('p') всегда будет возвращать true, поскольку возвращаемое значение функции filter является объектом Crawler, поэтому второй else if никогда не вызывался.
Если вы хотите проверить, есть ли в нем узлы, вы можете использовать функцию count().

Что касается вашего кода - я не уверен, почему это то, что вы делаете, но в основном ваш код проверяет, имеет ли текущий элемент дочерний элемент <p> (это то, что вы пытаетесь делать?), а если есть - вывести содержимое родительского узла text.

Чтобы получить узлы DOMElement от Crawler ($node), вы можете использовать

$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";
    }
});
person Dekel    schedule 08.08.2016
comment
Привет, спасибо за ответ. Это действительно очень помогло. Но у меня все еще есть проблема со ссылками и изображениями. Как я могу получить ссылки и src таким образом, например, если страница, которую я очищаю, example.com и имеет изображение - <img href="default.jpg"> -> img => src=http://example.com/default.jpg - person Xahed Kamal; 08.08.2016
comment
Вы можете комбинировать $domain и $node->getNode(0)->getAttribute('src'), однако обратите внимание, что вам может потребоваться проверить несколько вещей (например, структуру каталогов/обход). - person Dekel; 08.08.2016
comment
Я нашел решение для этого здесь - stackoverflow.com/a/8573193/3866364. В любом случае, спасибо за ответ. :) - person Xahed Kamal; 08.08.2016
comment
Отлично :) это специально для пути. - person Dekel; 08.08.2016