Symfony DomCrawler не возвращает ожидаемое значение

#php #symfony #domcrawler

#php #symfony #domcrawler

Вопрос:

Пример довольно прост. Я пытаюсь поэкспериментировать с DomCrawler Symfony и пытаюсь получить раздел загрузки официальной страницы PHP https://www.php.net / :

     <?php
    
    require __DIR__.'/../vendor/autoload.php';
    use SymfonyComponentDomCrawlerCrawler;
    use MastermindsHTML5;
    
    $url = 'https://www.php.net/';
    $content = file_get_contents($url);
    
    
    $crawler = new Crawler($content);
    $item = $crawler->filterXPath("/html/body/div[2]/div/div/div[2]");
    dd($item);
  

Но dd($item) возвращает то же самое, что и dd($crawler), как если бы filterXpath() ничего не сделал. Я что-то упустил? Я бы ожидал, что в $item будет что-то вроде «‘< div>divcontent< /div >'».

$item

Комментарии:

1. возвращаемое значение filterXPath — это, по сути, другой искатель, который имеет большинство тех же свойств (особенно $document одинаковый), но отличается в: $nodes, и вам действительно нужно повторить результат, чтобы получить соответствующие узлы. по сути, все функции фильтрации / поиска будут вызываться createSubCrawler , чтобы разрешить доступ к родителям и прочим. но в основном будет отличаться только узлами (как видно из этой функции)

2. Я не уверен, понял ли вы, что вы сказали. Как я должен получить текущую строку узла? Также в примере nodes: [] в переменной $item .

3. На самом деле, если я попробую какой-либо метод после filterXPath, он вернет «Неперехваченное исключение InvalidArgumentException: текущий список узлов пуст». что подтверждает мои подозрения, что filterXpath ничего не делает.

4. он что-то делает, но, по-видимому, ничего не сопоставляется, поэтому ваш список узлов пуст. Я только что попробовал ваш скрипт, и, по-видимому, вы не можете сопоставить <html> тег с помощью /html , но вместо этого должны делать //html . с этим изменением ваш список узлов больше не должен быть пустым

5. Да, вы правы. использование //htm вместо /html решает проблему. спасибо тебе большое за твою добрую волю помочь, Якуми! Все еще нахожу bti странным, что он работает только с использованием //html вместо официального xpath, предоставляемого браузером (/html …). Может быть, это можно считать ошибкой?