#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 >'».
Комментарии:
1. возвращаемое значение
filterXPath
— это, по сути, другой искатель, который имеет большинство тех же свойств (особенно $document одинаковый), но отличается в: $nodes, и вам действительно нужно повторить результат, чтобы получить соответствующие узлы. по сути, все функции фильтрации / поиска будут вызыватьсяcreateSubCrawler
, чтобы разрешить доступ к родителям и прочим. но в основном будет отличаться только узлами (как видно из этой функции)2. Я не уверен, понял ли вы, что вы сказали. Как я должен получить текущую строку узла? Также в примере nodes: [] в переменной $item .
3. На самом деле, если я попробую какой-либо метод после filterXPath, он вернет «Неперехваченное исключение InvalidArgumentException: текущий список узлов пуст». что подтверждает мои подозрения, что filterXpath ничего не делает.
4. он что-то делает, но, по-видимому, ничего не сопоставляется, поэтому ваш список узлов пуст. Я только что попробовал ваш скрипт, и, по-видимому, вы не можете сопоставить
<html>
тег с помощью/html
, но вместо этого должны делать//html
. с этим изменением ваш список узлов больше не должен быть пустым5. Да, вы правы. использование //htm вместо /html решает проблему. спасибо тебе большое за твою добрую волю помочь, Якуми! Все еще нахожу bti странным, что он работает только с использованием //html вместо официального xpath, предоставляемого браузером (/html …). Может быть, это можно считать ошибкой?