XPath рдФрд░ Yii рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦрдирд╛

рдкрд░рд┐рдЪрдп

рдХрднреА-рдХрднреА рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдЖрдкрдХреЛ рдЧреНрд░рд╛рд╣рдХ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрд╡рд╛ рдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реИрдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реЗрд╡рд╛ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдпрд╣ рдПрдкреАрдЖрдИ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рдВрдкреВрд░реНрдг рд╕рд╛рдордЧреНрд░реА рдкреГрд╖реНрда рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред

рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо XenForo рдлреЛрд░рдо рдбреЗрдореЛ рдФрд░ рдПрдХ рдкреВрд░реНрд╡-рдирд┐рд░реНрдорд┐рдд рд╡рд┐рд╖рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ рд╕реЗ рд╣рдо рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВрдЧреЗ: рд╢реАрд░реНрд╖рдХ, рдирд┐рд░реНрдорд╛рдг рд╕рдордп рдФрд░ рд╡рд┐рд╖рдп рдкрд╛рда рд╕реНрд╡рдпрдВ, рдЬрдмрдХрд┐ рдПрдХ рдЕрдзрд┐рдХреГрдд рдлреЛрд░рдо рдЦрд╛рддреЗ рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдиреНрдп рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Parser рдЦреБрдж Yii2 рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?


рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ

ParserXenforo рдШрдЯрдХ рдмрдирд╛рдПрдБред рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред

<?php namespace app\components; use Yii; use \yii\base\Object; class ParserXenforo extends Object { } 


рдкреЗрдЬ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЧреБрдг рдФрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣реЛрд╕реНрдЯ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо, рдкрд╛рд╕рд╡рд░реНрдб, рдХрд░реНрд▓рдСрдкреНрдЯ рдЧреБрдг рд╕реНрд╡рдпрдВ рдШрдЯрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

 <?php namespace app\components; use Yii; use \yii\base\Object; class ParserXenforo extends Object { /** * Uri      */ const REQUEST_URI_LOGIN = 'login/login'; /** *     cookies */ const COOKIES_FILE_NAME = 'cookies.txt'; /** * @var string    */ private $_data; /** * @var string   */ public $host; /** * @var string   */ public $username; /** * @var string   */ public $password; /** * @var array  cURL */ public $curlOpt; } 


рдкреЗрдЬ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╣реЗрдбрд░ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдПрдЬреЗрдВрдЯ рдХреЗ рд╕реЗрдЯ рдорд╛рдиреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдХрд░реНрд▓рдУрдкреНрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕реЗ cURL рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

 protected function getCurlOpt($nameOpt) { if ($nameOpt !== 'userAgent' && $nameOpt !== 'header') { return false; } return $this->curlOpt[$nameOpt]; } 

рдлреЛрд░рдо рдкрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧрд┐рди рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ POST рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░рд╛рдзрд┐рдХрд░рдг url (рд╣реЛрд╕реНрдЯ + рдкреНрд░рд╛рдзрд┐рдХрд░рдг url) рдмрдирд╛рдПрдВ

 protected function getLoginUrl() { return $this->host . self::REQUEST_URI_LOGIN; } 

рдФрд░ рдЕрдиреБрд░реЛрдз рдХреА рдкреЛрд╕реНрдЯ рд▓рд╛рдЗрди

 protected function createPostRequestForCurl() { return 'login=' . $this->username . '&password=' . $this->password . '&remember=1'; } 

рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдХреБрдХреА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкреВрд░реНрдг рдкрде рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдРрд╕рд╛ рддрд░реАрдХрд╛ рдмрдирд╛рдПрдВ рдЬреЛ рдЙрдкрдирд╛рдо рдкрде рд╕реЗ рдкреВрд░реНрдг рдкрде рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдЬреЛрдбрд╝рддрд╛ рд╣реИред

 protected function getPathToCookieFile($cookieFileName = self::COOKIES_FILE_NAME) { return Yii::getAlias('@app/runtime') . DIRECTORY_SEPARATOR . $cookieFileName; } 

рд╣рдо рдкрд╛рд░рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдкреГрд╖реНрда рдХреА рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХрд╛рд░реНрд░рд╡рд╛рдИ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо POST рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд╛рд░рд┐рдд url рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХреГрдд рдЦрд╛рддреЗ рдореЗрдВред рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдХреНрд╕рд░ рджреЗрдЦрд╛ рдХрд┐ рдЗрд╕ рдордВрдЪ рдкрд░ рд╡реЗ рдЕрдирдзрд┐рдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
_Data рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо Yii :: рдЬрд╛рдирдХрд╛рд░реА () рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд▓реЙрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИред

 public function loadUsingCurl($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $this->loginUrl); curl_setopt($ch, CURLOPT_FAILONERROR, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_REFERER, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $this->getCurlOpt('header')); curl_setopt($ch, CURLOPT_COOKIEFILE, $this->pathToCookieFile); curl_setopt($ch, CURLOPT_COOKIEJAR, $this->pathToCookieFile); curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1); curl_setopt($ch, CURLOPT_USERAGENT, $this->getCurlOpt('userAgent')); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $this->createPostRequestForCurl()); $this->_data = curl_exec($ch); if (curl_exec($ch) === false) { throw new \Exception(curl_errno($ch) . ': ' . curl_error($ch)); } curl_close($ch); Yii::info(Yii::t('app', 'Loading data page')); return $this; } 


рдШрдЯрдХ рдХрд╛ рдЖрдзрд╛рд░ рднрд╛рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рдЖрдкрдХреЛ рдЗрд╕реЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдПрдЬреЗрдВрдЯ рдореЗрдВ рдЖрдкрдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрд╣рд╛рдВ рдШрдЯрдХ рд╕реНрдерд┐рдд рд╣реИ, рдмреЗрд╕ рдпреВрдЖрд░рдПрд▓, рдФрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдбреЗрдЯрд╛ред
рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдореЗрдВ рджрд┐рдП рдЧрдП рдереЗ: рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдбреЗрдореЛред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдХреБрдЫ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рдпрд╛, рдпрд╛ рдпреВрдБ рдХрд╣реЗрдВ, 24 рдорд╛рд░реНрдЪ 2014 рдХреЛ рд╕реБрдмрд╣ 7:26 рдмрдЬреЗ рддрдХ

 .... 'components' => [ ... 'parser' => [ 'class' => 'app\components\ParserXenforo', 'host' => 'http://9af5766eb2759a49.demo-xenforo.com/130/index.php?', 'username' => 'admin', 'password' => 'admin', 'curlOpt' => [ 'userAgent' => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36', 'header' => [ 'Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1', 'Accept-Language: en-US,en;q=0.8,ru;q=0.6,uk;q=0.4', 'Accept-Charset: Windows-1251, utf-8, *;q=0.1', 'Accept-Encoding: deflate, identity, *;q=0', ] ] ], ... ], .... 

рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ, рд╣рдо рдПрдХреНрд╢рди рдореЗрдВ рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓реЙрдЧреНрд╕ рдРрдк рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЧрдпрд╛ рдерд╛

 $urlThread = 'http://9af5766eb2759a49.demo-xenforo.com/130/index.php?threads/some-thread.1/'; /** @var \app\components\ParserXenforo $dataParse */ $dataParse = Yii::$app->parser->loadUsingCurl($urlThread); 


рдбреЗрдЯрд╛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛

рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдкреГрд╖реНрда рдХреЗ DOMDocument рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реЗрдВред Libxml рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд┐рдкрд░реАрдд рдХрд░реЗрдВред рдкреГрд╖реНрда рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкреГрд╖реНрда рдХрд╛ DOM рдорд┐рд▓рддрд╛ рд╣реИред рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ DOM рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

 public function createDomDocument() { $this->_dom = new \DOMDocument(); libxml_use_internal_errors(true); if ($this->_dom->loadHTML($this->_data)) { Yii::info(Yii::t('app', 'Create DomDocument')); } else { Yii::info(Yii::t('app', 'An error occurred when creating an object of class DOMDocument')); } libxml_use_internal_errors(false); return $this; } 


рд╣рдо DOMXPath рд╡рд░реНрдЧ рдХреА рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП XPath рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛред

 public function createDomXpath() { $this->_xpath = new \DOMXPath($this->_dom); Yii::info(Yii::t('app', 'Create DomXpath')); return $this; } 


рдЦреИрд░, рдЕрдм рдЖрдк рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛: рд╢реАрд░реНрд╖рдХ, рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП XPath рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд╣рд▓реЗ рд╣рдо рд╣реЗрдбрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ _title рдЧреБрдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ

 public function parseTitle() { $xpathQuery = '*//h1'; $nodes = $this->_xpath->query($xpathQuery, $this->_dom); if ($nodes->length === 0) { Yii::info(Yii::t('app', 'Error parse title')); } $this->_title = $nodes->item(0)->nodeValue; Yii::info(Yii::t('app', 'Parse title')); return $this; } 


рдЖрдЧреЗ рд╣рдорд╛рд░реЗ рд╡рд┐рд╖рдп рдХрд╛ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк

 public function parseTimestamp() { $xpathQuery = '*//p[@id="pageDescription"]/a/abbr'; $nodes = $this->_xpath->query($xpathQuery, $this->_dom); if ($nodes->length === 0) { Yii::info(Yii::t('app', 'Error parse timestamp')); return $this; } //   timestamp $this->_timestamp = $nodes->item(0)->getAttribute('data-time'); Yii::info(Yii::t('app', 'Parse timestamp')); return $this; } 

рдЕрдВрддрд┐рдо рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

 public function parseContent() { $xpathQuery = '*//blockquote[@class="messageText ugc baseHtml"]'; $nodes = $this->_xpath->query($xpathQuery, $this->_dom); if ($nodes->length === 0) { Yii::info(Yii::t('app', 'Error parse content')); return $this; } $this->_content = $nodes->item(0)->nodeValue; Yii::info(Yii::t('app', 'Parse content')); return $this; } 


рдЪрд▓реЛ рдереЛрдбрд╝рд╛ рдкреАрдЫреЗ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ XPath рд╕реЗ рдХреНрдпрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдерд╛


рд╣рдо рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВрдЧреЗ (рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдХрд┐ рдбреЗрдЯрд╛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд╣реИ), рд╕рд╛рде рд╣реА рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ

 /** * @return \app\components\ParserXenforo */ public function endParse() { if (isset($this->_content, $this->_timestamp, $this->_content)) { Yii::info(Yii::t('app', 'End parse')); } else { Yii::info(Yii::t('app', 'Some data were not received')); } return $this; } /** * @return string title */ public function getTitle() { return $this->_title; } /** * @return int timestamp */ public function getTimestamp() { return $this->_timestamp; } /** * @return string content */ public function getContent() { return $this->_content; } 


рдЖрдЙрдЯрдкреБрдЯ рдкрд░рд┐рдгрд╛рдо

рдШрдЯрдХ рдХреЛ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддреИрдпрд╛рд░ рд╣реИ, рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ

 $urlThread = 'http://9af5766eb2759a49.demo-xenforo.com/130/index.php?threads/some-thread.1/'; /** @var \app\components\ParserXenforo $dataParse */ $dataParse = Yii::$app->parser ->loadUsingCurl($urlThread) ->createDomDocument() ->createDomXpath() ->parseTitle() ->parseTimeStamp() ->parseContent() ->endParse(); return $this->render('index', ['data' => $dataParse]); 


 <?php /** * @var yii\web\View $this * @var \app\components\ParserXenforo $data */ $this->title = 'My Yii Application'; ?> <div class="site-index"> <h1><?= $data->title; ?></h1> <p>Created At: <?= date('Ymd H:i:s', $data->timestamp); ?></p> <p><?= $data->content; ?></p> </div> 


рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рд╣реИред
рдЫрд╡рд┐

рдирд┐рд╖реНрдХрд░реНрд╖

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ XenForo рдордВрдЪ рд╡рд┐рд╖рдп рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Yii рдХреЗ рд▓рд┐рдП рдПрдХ рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреГрд╖реНрда рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред
рд╕рд╛рджреГрд╢реНрдп рд╕реЗ, рдЖрдк рдЕрдиреНрдп рдбреЗрдЯрд╛ рдХреА рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдПрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рднреА рдлреЛрд░рдо рд╡рд┐рд╖рдп, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ:

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдкрд╣рд▓реВ рдХреЛ рдирд╣реАрдВ рдЫреБрдЖ рдЧрдпрд╛ рдерд╛; рдпрд╣ рд▓реЗрдЦ рдкреГрд╖реНрда рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реЗрдХрд┐рди рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрдореБрдЦ рдерд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХрд╛ рд▓рд┐рдВрдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рд╛рдзрди

Yii2 рдиреНрдпреВрдирддрдо рдХрд╛ рд╡рд┐рд╡рд░рдг
Yii2 рдкреНрд░рд▓реЗрдЦрди
рд░реВрд╕реА рдореЗрдВ Xpath 1.0 рд╡рд┐рдирд┐рд░реНрджреЗрд╢
рд╕реНрд░реЛрдд рдХреЛрдб рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА

Source: https://habr.com/ru/post/In216227/


All Articles