ស្វែងយល់អំពី DomCrawler Component នៅក្នុង Symfony 3
DomCrawler Component គឺជា Component មួយក្នុងចំណោម Component ផ្សេងៗទៀតរបស់ Symfony។ នៅក្នុងអត្ថបទនេះ យើងនឹងធ្វើការលើកឡើងអំពី ការតម្លើង ការប្រើប្រាស់ ក៏ដូចជាធ្វើការបកស្រាយលើមុខងារមួយចំនួនដែលមាននៅក្នុង DomCrawler Component។
១) ការតម្លើង
មាន២របៀបដែលអ្នកអាចធ្វើការតម្លើងនូវ DomCrawler component បាន៖
ទី១៖ តម្លើងវាតាមរយៈ Composer (symfony/dom-crawler នៅលើ កញ្ចប់មួយនេះ)
ទី២៖ ប្រើនូវ official Git repository (https://github.com/symfony/dom-crawler)
បន្ទាប់ពីនេះ គឺវាទាមទារអោយមាននូវ vendor/autoload.php file ដើម្បីធ្វើការ enable នូវការធ្វើ autoload mechanism ដែលបានផ្ដល់ដោយ Composer។ បើមិនដូច្នោះទេ application របស់អ្នកនឹងមិនអាចស្វែងរកឃើញនូវ classes នៃ Symfony component នេះបានទេ។
២) ការប្រើប្រាស់
Crawler class ផ្ដល់នូវ methods ដើម្បីធ្វើការ query និង manipulate HTML និង XML documents។
ខាងក្រោមនេះជាឧទាហរណ៏នៃ Crawler ដែលតំណាងនូវសំណុំនៃ DOMElement objects ដែលជាមូលដ្ឋានគ្រឹះនៃ nodes ដែលអ្នកអាច ធ្វើការដោយឆ្លងកាត់វាបានយ៉ាងងាយស្រួល៖
Link, Image ហើយនិង Form classes គឺពេញនិយមបំផុតក្នុងការប្រាស្រ័យទាក់ទងជាមួយនឹង html links, images ហើយនិង forms ដូចដែលអ្នកឆ្លងកាត់វាតាមរយៈ HTML tree។
ចំណាំ៖ DomCrawler នឹងព្យាយាមក្នុងការជួសជុលនូវ HTML របស់អ្នកដោយស្វ័យប្រវត្តិដើម្បីផ្គូរផ្គងគ្នាទៅនឹងការបញ្ជាក់ជាផ្លូវការមួយ។ ឧទាហរណ៏ថា ប្រសិនបើអ្នកមាន <p> tag មួយនៅខាងក្នុង <p> tag ផ្សេងទៀត នោះវានឹងធ្វើការ move ទៅជា ថ្នាក់ parent tag។ នេះជាការរំពឹងទុកនឹងជាផ្នែកមួយនៃ HTML5 spec។ ប៉ុន្តែប្រសិនបើអ្នកទទួលបាននូវអ្វីដែលមិនដូចទៅនឹងការរំពឹងទុកនោះ នេះអាចជាមូលហេតុមួយ។ ហើយខណៈពេលដែល DomCrawler មិនបានធ្វើការ dump content ទេអ្នកអាចមើលទៅលើ “fixed” version នៃ HTML របស់អ្នកដោយ ធ្វើការ dump វា។
៣) Node Filtering
ការប្រើប្រាស់ XPath expression គឺពិតជាងាយស្រួលណាស់៖
Filtering គឺកាន់តែងាយស្រួលប្រសិនបើអ្នកមាន CssSelector component ដែលបានតម្លើងរួច។ វាអនុញ្ញាតអោយអ្នកប្រើនូវ jQuery-like selectors ដើម្បីឆ្លងកាត់៖
Annonymous function អាចនឹងត្រូវបានប្រើដើម្បីធ្វើការ filter ជាមួយនឹង ការគិតដែលស្មុគស្មាញខ្លាំង៖
ដើម្បី remove នូវ node នោះ anonymous function គឺត្រូវតែ return មកជា false។
ទាំង filterXPath() និង filter() method គឺធ្វើការជាមួយនឹង XML namespaces ដែលអាចត្រូវបានរកឃើញដោយស្វ័យប្រវត្តិរឺក៏ ចុះឈ្មោះយ៉ាងជាក់លាក់។
សូមគិតទៅលើ XML ខាងក្រោមនេះ៖
វាអាចនឹងបាន filter ជាមួយនឹង Crawler ក្រៅពីត្រូវការចុះឈ្មោះ namespace alias ទាំងពីរជាមួយនឹង filterXPath()៖
និង filter()៖
namespace អាចនឹង ចុះឈ្មោះយ៉ាងជាក់លាក់ជាមួយនឹង registerNamespace() method៖
៤) Node Traversing
ចូលទៅកាន់ node ដោយទីតាំងរបស់វានៅលើតារាងនេះ៖
ទទួលយកនូវ node ទី១ រឺចុងក្រោយគេនៃ current selection៖
ទទួលយកនូវ node នៃ level ដូចគ្នាជា current selection៖
ទទួលយកនូវ level nodes ដូចគ្នាបន្ទាប់ពី រឺក៏មុននៃ current selection៖
ទទួលយកនូវ child រឺក៏ parent nodes ទាំងអស់៖
៥) ការចូលទៅកាន់ Node Values
ចូលទៅកាន់ឈ្មោះរបស់ node (HTML tag name) នៃ node ទីមួយនៃ current selection (ដូចជា “p” រឺក៏ “div”)៖
ចូលទៅកាន់តម្លៃនៃ node ទីមួយនៃ current selection៖
ចូលទៅកាន់ attribute value នៃ node ទីមួយនៃ current selection៖
Extract attribute និង/រឺក៏ តម្លៃ node ពីតារាងនៃ nodes៖
ហៅ anonymous function នៅលើ node នីមួយៗ នៃ list៖
Anonymous function ទទួលនូវ node (ជា Crawler) និងទីតាំងជា arguments។ លទ្ធផលគឺ array នៃតម្លៃ ដែលបានបញ្ជូនមកដោយ anonymous function calls។
៦) ការបន្ថែម Content
Crawler supports នូវវិធីជាច្រើននៃការបន្ថែមនូវ content៖
ដូចទៅនឹងការ implement របស់ Crawler គឺផ្អែកទៅលើ DOM extension គឺវាមានលទ្ធភាពក្នុងការទំនាក់ទំនងជាមួយនឹង native DOMDocument, DOMNodeList និង DOMNode object៖
៧) Expression Evaluate
អ្វីដែលថ្មីក្នុង version 3.2៖ evaluate() method ត្រូវបានណែនាំនៅក្នុង Symfony 3.2។
evaluate() method គឺវាយតម្លៃនូវ XPath expression ដែលផ្ដល់ឲ្យ។ តម្លៃដែល return មកគឺអាស្រ័យលើ XPath expression។ ប្រសិនបើ expression វាយតម្លៃទៅលើ តម្លៃ scalar (ដូចជា HTML attributes), array នៃលទ្ធផលនឹងត្រូវបានបញ្ជូនមក។ ប្រសិនបើ expression ធ្វើការវាយតម្លៃទៅលើ DOM document នោះ Crawler instance នឹងត្រូវបានបញ្ជូនត្រលប់មកវិញ។
លក្ខណៈបែបនេះគឺសាកសមបំផុតជាមួយនឹងឧទាហរណ៏ខាងក្រោម៖
៨) Links
ដើម្បីស្វែងរក link ដោយឈ្មោះ (រឺក៏ចុចទៅលើរូបភាពដោយ alt attribute របស់វា), ប្រើនូវ selectLink() method ស្ថិតនៅ crawler ដែលមានរួចស្រេច។ វានឹង return នូវ Crawler instance ជាមួយនឹង link(s) ដែលបានចុច។ ធ្វើការហៅ link() ដែលផ្ដល់អោយអ្នកនូវ Link object ពិសេសមួយ៖
Link object មាន methods ដ៏ពេញនិយមក្នុងការប្រើប្រាស់ជាច្រើន ដើម្បីទទួលបាននូវព័ត៌មានអំពី link ដែលបានចុចរួចដោយខ្លួនវាផ្ទាល់៖
៩) រូបភាព (Images)
ដើម្បីស្វែងរករូបភាពដោយ alt attribute របស់វា គឺប្រើនូវ selectImage method ដែលស្ថិតនៅ crawler ដែលមានរួច។ វានឹង returns នូវ Crawler instance ជាមួយនឹង រូបភាពដែលបានជ្រើសរើសរួច។ ធ្វើការហៅ image() ដែលផ្ដល់អោយអ្នកនូវ Image object ដ៏ពិសេសមួយ៖
Image object គឺមាន getUri() method ដូចទៅនឹង Link ដែរ។
១០) Forms
ប្រព្រឹត្តកម្មពិសេសមួយគឺត្រូវបានផ្ដល់ទៅអោយ forms។ selectButton() method គឺ available នៅលើ Crawler ណាមួយដែល returns មកនូវ Crawler ណាមួយផ្សេងទៀតដែលផ្គូរផ្គងទៅនឹង ប៊ូតុង ( input[type=submit] , input[type=image] , រឺក៏ button) ជាមួយនឹងអត្ថបទ(text) ដែលបានអោយ។ method នេះគឺមានប្រយោជន៏យ៉ាងពិសេសដោយសារតែអ្នកអាចប្រើវាដើម្បី return នូវ Form object ដែលបង្ហាញនូវ form ដែលប៊ូតុងតាំងនៅ៖
Form object មាន methods ដែលមានប្រយោជន៏ជាច្រើនសម្រាប់ធ្វើការជាមួយនឹង forms៖
getUri() method អាចធ្វើអ្វីបានច្រើនលើសពីការ return នូវ action attribute នៃ form ទៅទៀត។ ប្រសិនបើ form method គឺជា GET, បន្ទាប់មកវាធ្វើត្រាប់តាម លក្ខណៈនៃ browser និង return នូវ action attribute ដែលស្របដោយ query string នៃ តម្លៃទាំងអស់របស់ form ។
អ្នកអាច កំណត់និងទទួលយកតម្លៃនៅលើ form បានដោយជាក់ស្ដែង៖
ដើម្បីធ្វើការជាមួយនឹង multi-dimensional fields សូមមើលរូបភាពខាងក្រោម៖
ធ្វើការ pass នូវ array នៃ តម្លៃ៖
Form object អនុញ្ញាតអោយអ្នកក្នុងការប្រាស្រ័យទាក់ទងជាមួយនឹង form របស់អ្នកដូចជា browser, ការជ្រើសនូវ radio values, ការ tick លើ checkboxes និងការ upload files៖
១១) ការប្រើប្រាស់ Form Data
តើអ្វីដែលជាចំណុចសំខាន់នៃការធ្វើរឿងទាំងនេះ? ប្រសិនបើអ្នកកំពុងតែសាកល្បងនៅក្នុងកុំព្យូរទ័រ អ្នកអាចចាប់បានហើយនូវ ព័ត៌មាននៃ form របស់អ្នកបានដូចជា ប្រសិនបើវាត្រូវបានធ្វើការ submit ដោយការប្រើប្រាស់ PHP values៖
ប្រសិនបើអ្នកកំពុងប្រើប្រាស់នូវ external HTTP client អ្នកអាចប្រើនូវ form ដើម្បីធ្វើការចាប់យកនូវព័ត៌មានទាំងអស់ ដែលអ្នកត្រូវការដើម្បីបង្កើត POST request សម្រាប់ form៖
ឧទាហរណ៏ដ៏ល្អមួយនៃ ការ integrate system ដែលប្រើនូវ Goutte ទាំងអស់នេះ។ Goutte យល់ច្បាស់អំពី Symfony Crawler object និងអាចប្រើវាដើម្បីធ្វើការ submit form ដោយផ្ទាល់៖
១២) ការ Select Invalid Choice Values
ជា default គឺ choice fields (select, radio) គឺមាន internal validation activated ដើម្បីការពារអ្នកពីការកំណត់នូវ Invalid values។ ប្រសិនបើអ្នកចង់ ធ្វើការកំណត់នូវ invalid values អ្នកអាចប្រើ disableValidation() method នៅលើ form ទាំងមូលរឺក៏ field(s) ជាក់លាក់ណាមួយ៖