Гусеничный + Жрать: Доступ к форме
Я использую клиент php guzzle для захвата веб-сайта, а затем обрабатываю его с помощью обходчика symfony 2.1
Я пытаюсь получить доступ к форме.... например, эта тестовая форма здесь http://de.selfhtml.org/javascript/objekte/anzeige/forms_method.htm
$url = 'http://de.selfhtml.org/javascript/objekte/anzeige/forms_method.htm';
$client = new Client($url);
$request = $client->get();
$request->getCurlOptions()->set(CURLOPT_SSL_VERIFYHOST, false);
$request->getCurlOptions()->set(CURLOPT_SSL_VERIFYPEER, false);
$response = $request->send();
$body = $response->getBody(true);
$crawler = new Crawler($body);
$filter = $crawler->selectButton('submit')->form();
var_dump($filter);die();
Но я получаю исключение:
Текущий список узлов пуст.
Так что я немного запутался в том, как получить доступ к форме
1 answers
Попробуйте использовать Goutte, это библиотека для очистки экрана и обхода веб-страниц, созданная поверх инструментов, которые вы уже используете (Guzzle, обходчик Symfony2). Смотрите Репозиторий GitHub для получения дополнительной информации.
Ваш код будет выглядеть так, если использовать Goutte
<?php
use Goutte\Client;
$url = 'http://de.selfhtml.org/javascript/objekte/anzeige/forms_method.htm';
$client = new Client();
$crawler = $client->request('GET', $url);
$form = $crawler->selectButton('submit')->form();
$crawler = $client->submit($form, array(
'username' => 'myuser', // assuming you are submitting a login form
'password' => 'P@S5'
));
var_dump($crawler->count());
echo $crawler->html();
echo $crawler->text();
Если вам действительно нужно настроить параметры ЗАВИТКА, вы можете сделать это следующим образом:
<?php
$url = 'http://de.selfhtml.org/javascript/objekte/anzeige/forms_method.htm';
$client = new Client();
$guzzle = $client->getClient();
$guzzle->setConfig(
array(
'curl.CURLOPT_SSL_VERIFYHOST' => false,
'curl.CURLOPT_SSL_VERIFYPEER' => false,
));
$client->setClient($guzzle);
// ...
ОБНОВЛЕНИЕ:
При использовании DomCrawler я часто получаю ту же ошибку. Большую часть времени это потому, что я не выбор правильного элемента на странице или потому, что он не существует. Попробуйте вместо использования:
$crawler->selectButton('submit')->form();
Выполните следующие действия:
$form = $crawler->filter('#signin_button')->form();
Где вы используете метод фильтра, чтобы получить элемент по идентификатору, если он есть '#signin_button'
, или вы также можете получить его по классу '.signin_button'
.
Метод фильтра требует Компонента cssSelector.
Также отладьте свою форму, распечатав HTML (echo $crawler->html();
) и убедившись, что вы действительно находитесь на нужной странице.