php - 履带式+喷口 : Accessing to form

标签 php symfony symfony-2.1 guzzle

我是用php guzzle Client抓取网站,然后用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();

但我得到了异常(exception):

The current node list is empty.

所以我有点迷茫,不知道如何访问表单

最佳答案

尝试使用 Goutte,它是一个屏幕抓取和网络爬虫库,构建在您已经使用的工具(Guzzle、Symfony2 Crawler)之上。查看GitHub repo获取更多信息。

使用 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();

如果你真的需要设置 CURL 选项,你可以这样做:

<?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',您使用过滤器方法通过 id 获取元素,或者您也可以通过类 '.signin_button' 获取它. 过滤方法需要The CssSelector Component .

还可以通过打印出 HTML (echo $crawler->html();) 来调试您的表单,并确保您确实在正确的页面上。

关于php - 履带式+喷口 : Accessing to form,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15834369/

相关文章:

php - 如何将图像标题放在菜单和部分上?

php - 我们如何将 php 页面属性值发送到 php 类方法

php - `AND` 和 `OR` 一起出现在 `Yii` `ActiveRecord` `findAllByAtributes` 中

php - 在 Symfony kernel.controller 事件中,ControllerEvent::getController() 的返回类型是什么?

php - Symfony - 使用注释指定服务不共享

php - 使用 PHP 通过 HTML 表单发送电子邮件附件

php - 仅自定义 Symfony 表单的数组元素/片段

symfony - 在 Symfony2 中流式传输响应

symfony-forms - 如何向集合添加违规?

unit-testing - 依赖注入(inject)测试单元