Parsowanie stron internetowych z użyciem sfWebBrowser i SimpleXML

sfWebBrowser to klasa emulująca wywołania przeglądarki internetowej. Dzięki niej możemy zaprogramować nawigację po stronie www przy pomocy przyjemnego, obiektowego interfejsu. Odpowiedź może zostać zwrócona jako element SimpleXML, co umożliwia wykonywanie zapytań xpath na parsowanym dokumencie. Z łatwością możemy dostać część strony, która nas interesuje przy pomocy prostego wywołania:

$xml->xpath('//table[@class="main"]//tr[@class="odd" or @class="even"]');

Niestety strony internetowe rzadko są poprawnymi dokumentami XML. W większości przypadków sfWebBrowser raczej wyrzuci wyjątek, niż zwróci coś interesującego. Jest jednak sposób, aby temu zaradzić. Możemy nadpisać metodę getResponseXML, aby  utworzyła element klasy SimpleXMLElement z dokumentu DOM, gdyby oryginalna metoda zawiodła.

<?php
/*
 * (c) 2008 Jakub Zalas
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

/**
 * Web browser
 *
 * @package    zToolsPlugin
 * @subpackage lib
 * @author     Jakub Zalas <jakub@zalas.pl>
 * @version    SVN: $Id$
 */
class zWebBrowser extends sfWebBrowser
{
  /**
   * Returns response as XML
   *
   * If reponse is not a valid XML it is being created from
   * a DOM document which is being created from a text response
   * (this is the case for not valid HTML documents).
   *
   * @return SimpleXMLElement
   */
  public function getResponseXML()
  {
    try
    {
      $this->responseXml = parent::getResponseXML();
    }
    catch (Exception $exception)
    {
      $doc = new DOMDocument();
      $doc->loadHTML($this->getResponseText());
      $this->responseXml = simplexml_import_dom($doc);
    }

    return $this->responseXml;
  }
}

Komentarze