php - কিভাবে আপনি প্যারামিটার এইচটিএমএল/এক্সএমএল প্যারিস এবং প্রক্রিয়া?




xml parsing (20)

নেটিভ এক্সএমএল এক্সটেনশন

আমি নেটিভ এক্সএমএল এক্সটেনশানগুলির একটি ব্যবহার করে পছন্দ করি কারণ তারা পিএইচপি সহ বান্ডলেড হয়ে থাকে, সাধারণত সব তৃতীয় পক্ষের লিব্দের তুলনায় দ্রুত এবং মার্কআপের উপর আমার সমস্ত নিয়ন্ত্রণ আমাকে দেয়।

DOM

DOM এক্সটেনশানটি আপনাকে পিএইচপি 5 এর সাথে DOM API এর মাধ্যমে এক্সএমএল ডকুমেন্টগুলিতে কাজ করতে দেয়। এটি W3C এর ডকুমেন্ট অবজেক্ট মডেল কোর লেভেল 3, একটি প্ল্যাটফর্ম- এবং ভাষা-নিরপেক্ষ ইন্টারফেসের বাস্তবায়ন যা প্রোগ্রাম এবং স্ক্রিপ্টগুলিকে গতিশীলভাবে অ্যাক্সেস এবং আপডেট করার মঞ্জুরি দেয় বিষয়বস্তু, গঠন এবং নথি শৈলী।

DOM বাস্তব বিশদ (ভাঙা) HTML বিশ্লেষণ এবং সংশোধন সক্ষম এবং এটি XPath প্রশ্ন করতে পারেন। এটি libxml উপর ভিত্তি করে।

DOM এর সাথে উত্পাদনশীল হওয়ার জন্য কিছু সময় লাগে, কিন্তু সেই সময়টি আইএমও এর মূল্যবান। যেহেতু DOM একটি ভাষা-অ্যাগনস্টিক ইন্টারফেস, তাই আপনি অনেক ভাষায় বাস্তবায়ন খুঁজে পাবেন, তাই আপনাকে যদি আপনার প্রোগ্রামিং ভাষা পরিবর্তন করতে হবে তবে সম্ভাবনা আছে আপনি তখনই সেই ভাষাটির DOM API কীভাবে ব্যবহার করবেন তা জানবেন।

একটি মৌলিক ব্যবহার উদাহরণটি একটি উপাদানটির href বৈশিষ্ট্যটি গ্র্যাব্বিংয়ে পাওয়া যেতে পারে এবং একটি সাধারণ ধারণামূলক ওভারভিউ php in DOMDocument এ পাওয়া যেতে পারে।

DOM এক্সটেনশানটি কীভাবে ব্যবহার করবেন তা স্ট্যাকঅভারফ্লোতে ব্যাপকভাবে আচ্ছাদিত করা হয়েছে , তাই আপনি যদি এটি ব্যবহার করতে চান তবে আপনি নিশ্চিত করতে পারেন যে আপনার দ্বারা চালিত বেশিরভাগ সমস্যা অনুসন্ধান / ব্রাউজিং স্ট্যাক ওভারফ্লো দ্বারা সমাধান করা যেতে পারে।

XMLReader

এক্সএমএল রিডার এক্সটেনশান একটি এক্সএমএল পুল পসার। পাঠক একটি কার্সার হিসাবে কাজ করে যা নথির প্রবাহে এগিয়ে যাচ্ছে এবং পথে প্রতিটি নোডে আটকে যাচ্ছে।

XMLReader, DOM মত, libxml এর উপর ভিত্তি করে। আমি এইচটিএমএল পার্সার মডিউলটি কীভাবে ট্রিগার করতে পারি তা সম্পর্কে সচেতন নই, তাই ভাঙা এইচটিএমএল রিডারটি ব্যবহার করা হচ্ছে DOM ব্যবহার করার চেয়ে ভাঙা এইচটিএমএল পারাপারের জন্য কম শক্ত হতে পারে যেখানে আপনি এটি libxml এর HTML পার্সার মডিউল ব্যবহার করতে স্পষ্টভাবে বলতে পারেন।

একটি মৌলিক ব্যবহার উদাহরণ পিএইচপি ব্যবহার করে h1 ট্যাগ থেকে সব মান পেয়ে পাওয়া যাবে

এক্সএমএল পার্সার

এই এক্সটেনশনটি আপনাকে এক্সএমএল প্যাসার্স তৈরি করতে এবং তারপরে বিভিন্ন এক্সএমএল ইভেন্টগুলির জন্য হ্যান্ডলারগুলিকে সংজ্ঞায়িত করতে দেয়। প্রতিটি এক্সএমএল পসারের এছাড়াও আপনি সামঞ্জস্য করতে পারেন কয়েক পরামিতি আছে।

এক্সএমএল পার্সার লাইব্রেরিটি libxml ভিত্তিক এবং SAX স্টাইল এক্সএমএল push parser প্রয়োগ করে। এটি DOM বা SimpleXML এর চেয়ে মেমরি পরিচালনার জন্য একটি ভাল পছন্দ হতে পারে তবে XMLReader দ্বারা প্রয়োগ করা পুল পসারের সাথে কাজ করা আরও কঠিন হবে।

SimpleXml

SimpleXML এক্সটেনশানটি এক্সটেনশানকে সাধারণ বস্তু নির্বাচক এবং অ্যারে এটিরেটরের সাথে প্রক্রিয়া করতে পারে এমন একটি বস্তুতে রূপান্তর করতে একটি খুব সহজ এবং সহজেই ব্যবহারযোগ্য টুলসেট সরবরাহ করে।

SimpleXML একটি বিকল্প যখন আপনি জানেন যে এইচটিএমএল বৈধ এক্সএইচটিএমএল। আপনি যদি ভাঙা HTML বিশ্লেষণ করতে চান তবে SimpleXml এও বিবেচনা করবেন না কারণ এটি হ্রাস পাবে।

একটি সাধারণ ব্যবহার উদাহরণটি সিআরডুড নোড এবং এক্সএমএল ফাইলের নোড মানগুলিতে একটি সাধারণ প্রোগ্রামে পাওয়া যায় এবং পিএইচপি ম্যানুয়ালটিতে প্রচুর অতিরিক্ত উদাহরণ রয়েছে

তৃতীয় পক্ষের লাইব্রেরি (libxml ভিত্তিক)

আপনি যদি তৃতীয়-পক্ষের libxml ব্যবহার করতে পছন্দ করেন তবে আমি এমন একটি libxml ব্যবহার করার প্রস্তাব দিই যা আসলে স্ট্রিং libxml পরিবর্তে DOM / libxml ব্যবহার করে।

FluentDom - Repo

FluentDOM পিএইচপি ডমডকুমেন্টের জন্য একটি jQuery মত তরল এক্সএমএল ইন্টারফেস প্রদান করে। সিলেক্টরগুলি এক্সপ্যাথ বা সিএসএসে লেখা থাকে (এক্সপিথ কনভার্টারে সিএসএস ব্যবহার করে)। বর্তমান সংস্করণগুলি ড্যাম ইন্টারন্যাশনাল ইন্টারফেসগুলি বাস্তবায়নের প্রসারিত করে এবং DOM লিভিং স্ট্যান্ডার্ড থেকে বৈশিষ্ট্য যুক্ত করে। FluentDOM JSON, CSV, JsonML, RabbitFish এবং অন্যান্যদের মতো ফরম্যাটগুলি লোড করতে পারে। কম্পোজার মাধ্যমে ইনস্টল করা যাবে।

HtmlPageDom

Wa72 \ HtmlPageDom` হ'ল এইচটিএমএল ডকুমেন্টগুলির সহজ ম্যানিপুলেশন ব্যবহারের জন্য একটি পিএইচপি লাইব্রেরি, এটি ডম ক্রোলারকে সিএমফোনি 2 উপাদান থেকে ডম গাছের ট্র্যাভোরিংয়ের জন্য প্রয়োজন এবং এইচটিএমএল ডকুমেন্টগুলির DOM ট্রি ম্যানিপুলিউট করার জন্য পদ্ধতি যোগ করে এটি প্রসারিত করে।

phpQuery (বছর ধরে আপডেট করা হয় না)

phpQuery একটি সার্ভার-পার্শ্ব, চেইনযোগ্য, CSS3 সিলেক্টর চালিত ডকুমেন্ট অবজেক্ট মডেল (DOM) API, পিএইচপি 5 এ লিখিত jQuery জাভাস্ক্রিপ্ট লাইব্রেরি এবং অতিরিক্ত কমান্ড লাইন ইন্টারফেস (CLI) সরবরাহ করে।

এছাড়াও দেখুন: https://github.com/electrolinux/phpquery

Zend_Dom

Zend_Dom DOM নথি এবং কাঠামোর সাথে কাজ করার জন্য সরঞ্জাম সরবরাহ করে। বর্তমানে, আমরা Zend_Dom_Query অফার করি, যা XPath এবং CSS সিলেক্টর উভয় ব্যবহার করে ডম ডকুমেন্টগুলি অনুসন্ধানের জন্য একটি সমন্বিত ইন্টারফেস সরবরাহ করে।

QueryPath

এক্সএমএল এবং এইচটিএমএল ম্যানিপুলিউটিংয়ের জন্য QueryPath একটি পিএইচপি লাইব্রেরি। এটি শুধুমাত্র স্থানীয় ফাইলগুলির সাথে কাজ করার জন্য নয়, ওয়েব পরিষেবাদি এবং ডাটাবেস সংস্থার সাথেও ডিজাইন করা হয়েছে। এটি বেশিরভাগ jQuery ইন্টারফেস (সিএসএস-শৈলী নির্বাচক সহ) প্রয়োগ করে, তবে এটি সার্ভার-পার্শ্ব ব্যবহারের জন্য ব্যাপকভাবে টিউন করা হয়। কম্পোজার মাধ্যমে ইনস্টল করা যাবে।

fDOMDocument

fDOMDocument পরিবর্তে পিএইচপি সতর্কবার্তা বা নোটিশগুলির পরিবর্তে ত্রুটিগুলির সব সময়ে ব্যতিক্রমগুলি ব্যবহার করতে আদর্শ DOM প্রসারিত করে। তারা সুবিধার জন্য এবং DOM ব্যবহারের সহজতর করার জন্য বিভিন্ন কাস্টম পদ্ধতি এবং শর্টকাটগুলি যোগ করে।

sabre/xml

saber / xml একটি লাইব্রেরি যা একটি সাধারণ "XML / object array / array" ম্যাপিং সিস্টেম এবং নকশা প্যাটার্ন তৈরি করার জন্য XMLReader এবং XMLWriter ক্লাসগুলি wraps এবং প্রসারিত করে। এক্সএমএল লেখা এবং পড়া একক পাস এবং তাই দ্রুত হতে পারে এবং বড় এক্সএমএল ফাইলগুলিতে কম মেমরি প্রয়োজন।

FluidXML

ফ্লুইডএক্সএমএল একটি সংক্ষিপ্ত এবং তাত্ক্ষণিক API সহ এক্সএমএল ম্যানিপুলিউটিংয়ের জন্য একটি পিএইচপি লাইব্রেরি। এটি XPath এবং তাত্ক্ষণিক প্রোগ্রামিং প্যাটার্ন মজা এবং কার্যকর হতে বহন করে।

তৃতীয় পক্ষ (libxml ভিত্তিক নয়)

DOM / libxml এ বিল্ডিংয়ের সুবিধা হল যে আপনি বাক্সের বাইরে ভাল পারফরম্যান্স পান কারণ আপনি একটি স্থানীয় সম্প্রসারণের উপর ভিত্তি করে রয়েছেন। যাইহোক, সব তৃতীয় পক্ষের libs এই রুট নিচে যান না। তাদের কিছু নীচে তালিকাভুক্ত

পিএইচপি সহজ এইচটিএমএল DOM পার্সার

  • পিএইচপি 5+ এ লেখা একটি এইচটিএমএল ডোম প্যাসারার সাহায্যে আপনি এইচটিএমএলকে খুব সহজ ভাবে কাজে লাগাতে পারবেন!
  • পিএইচপি 5+ প্রয়োজন।
  • অবৈধ এইচটিএমএল সমর্থন করে।
  • JQuery এর মতো নির্বাচকদের সাথে একটি HTML পৃষ্ঠায় ট্যাগগুলি খুঁজুন।
  • একটি একক লাইন এইচটিএমএল থেকে বিষয়বস্তু নিষ্কাশন করুন।

আমি সাধারণত এই পসারের সুপারিশ করবেন না। কোডবেসটি ভয়ঙ্কর এবং প্যাসার নিজেই ধীর এবং মেমরি ক্ষুধার্ত। সমস্ত jQuery নির্বাচক (যেমন শিশু নির্বাচক ) সম্ভব নয়। Libxml ভিত্তিক লাইব্রেরিগুলির যে কোনওটি সহজেই এইটিকে অতিক্রম করা উচিত।

পিএইচপি এইচটিএমএল পার্সার

PHPHtmlParser একটি সহজ, নমনীয়, এইচটিএমএল প্যাসারার যা আপনাকে jQuery এর মত কোন CSS সিলেক্টর ব্যবহার করে ট্যাগ নির্বাচন করতে দেয়। লক্ষ্যটি হ'ল এমন সরঞ্জামগুলির উন্নয়নে সহায়তা করা যা HTML, স্ক্র্যাপ করার দ্রুত, সহজ উপায় প্রয়োজন, তা বৈধ কিনা বা না! এই প্রকল্পটি মূলত সনরা / পিএইচপি-সরল-এইচটিএমএল-ডোম-পার্সার দ্বারা সমর্থিত কিন্তু সহায়তাটি বন্ধ হয়ে গেছে বলে মনে হচ্ছে তাই এই প্রকল্পটি তার পূর্ববর্তী কাজের আমার অভিযোজন।

আবার, আমি এই পসারের সুপারিশ করবে না। এটি উচ্চ CPU ব্যবহারের সাথে বরং ধীর। তৈরি DOM বস্তুর মেমরি সাফ করার জন্য কোনও ফাংশন নেই। এই সমস্যা বিশেষ করে নেস্টেড loops সঙ্গে স্কেল। 14 এপ্রিল 16 তারিখ থেকে কোনো প্রতিক্রিয়া ছাড়াই ডকুমেন্টেশন নিজেই ভুল এবং ভুল বানানযুক্ত।

Ganon

  • একটি সার্বজনীন টোকেনাইজার এবং এইচটিএমএল / এক্সএমএল / আরএসএস DOM পার্সার
    • উপাদান এবং তাদের গুণাবলী ম্যানিপুলেট করার ক্ষমতা
    • অবৈধ এইচটিএমএল এবং UTF8 সমর্থন করে
  • উপাদানগুলিতে উন্নত CSS3- মত প্রশ্নগুলি সম্পাদন করতে পারে (যেমন jQuery - নামস্থান সমর্থিত)
  • একটি HTML beautifier (HTML টিডি মত)
    • সিআইএস এবং জাভাস্ক্রিপ্ট minify
    • সাজানোর বৈশিষ্ট্য, অক্ষর ক্ষেত্রে পরিবর্তন, সঠিক ইন্ডেন্টেশন, ইত্যাদি
  • প্রসার্য
    • বর্তমান চরিত্র / টোকেন উপর ভিত্তি করে callbacks ব্যবহার করে নথি পার্সিং
    • অপারেশন সহজ overriding জন্য ছোট ফাংশন মধ্যে বিচ্ছিন্ন
  • দ্রুত এবং সহজ

এটা ব্যবহার না। এটা কোন ভাল যদি বলতে পারে না।

এইচটিএমএল 5

আপনি HTML5 টি প্যারিস করার জন্য উপরেরটি ব্যবহার করতে পারেন, তবে মার্কআপ HTML5 অনুমতিতে কুইক থাকতে পারে । তাই HTML5 এর জন্য আপনি একটি ডেডিকেটেড পসারের মত বিবেচনা করতে চান

html5lib

প্রধান ডেস্কটপ ওয়েব ব্রাউজারগুলির সাথে সর্বাধিক সামঞ্জস্যের জন্য WHATWG HTML5 স্পেসিফিকেশন উপর ভিত্তি করে একটি HTML প্যাসারের একটি পাইথন এবং পিএইচপি বাস্তবায়ন।

HTML5 একবার চূড়ান্ত হওয়ার পরে আমরা আরো ডেডিকেটেড পার্সার দেখতে পারি। ডাব্লু 3 এর শিরোনাম হোয়া টু টু এইচটিএমএল 5 প্যারিসিং এর একটি ব্লগপস্ট রয়েছে যা চেক করার যোগ্য।

ওয়েব সার্ভিস

আপনি পিএইচপি প্রোগ্রামিং মত মনে করেন না, আপনি ওয়েব পরিষেবাদি ব্যবহার করতে পারেন। সাধারণভাবে, আমি এই জন্য খুব সামান্য ইউটিলিটি খুঁজে পাওয়া যায় নি, কিন্তু যে শুধু আমার এবং আমার ব্যবহার ক্ষেত্রে।

ScraperWiki

ScraperWiki এর বহিরাগত ইন্টারফেস আপনাকে ওয়েবে বা আপনার নিজের অ্যাপ্লিকেশনগুলিতে ব্যবহারের জন্য আপনি যে ফর্মটি ব্যবহার করতে চান সেটি বের করতে পারবেন। আপনি যে কোনো scraper রাষ্ট্র সম্পর্কে তথ্য নিষ্কাশন করতে পারেন।

নিয়মিত অভিব্যক্তি

সর্বশেষ এবং অন্তত সুপারিশ করা হয়েছে , আপনি নিয়মিত এক্সপ্রেশন সহ HTML থেকে তথ্য সরাতে পারেন। এইচটিএমএল নিয়মিত এক্সপ্রেশন ব্যবহার করে সাধারণভাবে নিরুৎসাহিত হয়।

মার্কআপের সাথে মেলানোর জন্য আপনি ওয়েবে সর্বাধিক স্নিপেটগুলি ভঙ্গুর। বেশিরভাগ ক্ষেত্রেই তারা শুধুমাত্র এইচটিএমএল একটি খুব নির্দিষ্ট টুকরা জন্য কাজ করা হয়। ক্ষুদ্র মার্কআপ পরিবর্তনগুলি, কোথাও হোয়াইট স্পেস যোগ করা, বা যোগ করা, বা ট্যাগের বৈশিষ্ট্যগুলি পরিবর্তন করার মতো, সঠিকভাবে লেখা না থাকলে রেজিক্স ব্যর্থ হয়। আপনি এইচটিএমএল RegEx ব্যবহার করার আগে আপনি কি করছেন তা জানতে হবে।

এইচটিএমএল প্যাসার্স ইতিমধ্যে এইচটিএমএল এর সিনট্যাকটিক নিয়ম জানেন। নিয়মিত এক্সপ্রেশন আপনাকে লিখতে প্রতিটি নতুন RegEx জন্য শিখতে হবে। RegEx কিছু ক্ষেত্রে জরিমানা, কিন্তু এটি সত্যিই আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে।

আপনি আরো নির্ভরযোগ্য পার্সার লিখতে পারেন , কিন্তু নিয়মিত এক্সপ্রেশনগুলির সাথে একটি সম্পূর্ণ এবং নির্ভরযোগ্য কাস্টম প্যাসারার লিখতে সময় কাটানো হয় যখন উপরে উল্লেখিত লাইব্রেরিগুলি বিদ্যমান থাকে এবং এটিতে আরও ভাল কাজ করে।

এছাড়াও পার্সিং এইচটিএমএল Cthulhu ওয়ে দেখুন

বই

আপনি কিছু টাকা ব্যয় করতে চান, একটি চেহারা আছে

আমি পিএইচপি স্থপতি বা লেখক সঙ্গে সম্বন্ধযুক্ত না।

কিভাবে এইচটিএমএল / এক্সএমএল পার্স এবং এটি থেকে তথ্য নিষ্কাশন করতে পারেন?


1 এবং ২ এর জন্য: আমি নতুন সিম্ফনি কম্পোনেন্ট ক্লাস ডোমক্রলার ( DomCrawler ) এর জন্য ভোট দেব। এই ক্লাস সিএসএস নির্বাচক অনুরূপ প্রশ্নের অনুমতি দেয়। বাস্তব বিশ্বের উদাহরণের জন্য এই উপস্থাপনাটি দেখুন: news-of-the-symfony2-world

উপাদানটি একাডেমিক কাজ করার জন্য ডিজাইন করা হয়েছে এবং সিম্ফনি ছাড়া ব্যবহার করা যেতে পারে।

শুধুমাত্র অপূর্ণতা এটি পিএইচপি 5.3 বা নতুন সঙ্গে কাজ করবে।


আপনি কোনও "ভাঙা" HTML পরিষ্কার করতে এবং HTML এ এক্সএটিএমএমে রূপান্তর করতে এইচটিএমএল টিডি মত কিছু ব্যবহার করার চেষ্টা করতে পারেন, যা আপনি একটি এক্সএমএল প্যাসারের সাথে পার্স করতে পারেন।


আপনি চেষ্টা করতে পারেন আরেকটি বিকল্প QueryPath । এটা jQuery দ্বারা অনুপ্রাণিত, কিন্তু পিএইচপি সার্ভারে এবং Drupal ব্যবহার করা হয়।



আমি PHPPowertools/DOM-Query নামে একটি লাইব্রেরি তৈরি করেছি যা আপনাকে jQuery এর সাথে HTML5 এবং XML ডকুমেন্টগুলি ক্রল করতে দেয়।

হুডের অধীনে, এটি সিপিএফনি / ডোমক্রলার ব্যবহার করে সিপিএস সিলেক্টরগুলিকে এক্সপিথ সিলেক্টর রূপান্তর করতে। সৎ কর্মক্ষমতা নিশ্চিত করার জন্য, এটি একটি বস্তু অন্যের কাছে যাওয়ার সময়ও একই ডোমডকুমেন্টটি ব্যবহার করে।

উদাহরণ ব্যবহার করুন:

namespace PowerTools;

// Get file content
$htmlcode = file_get_contents('https://github.com');

// Define your DOMCrawler based on file string
$H = new DOM_Query($htmlcode);

// Define your DOMCrawler based on an existing DOM_Query instance
$H = new DOM_Query($H->select('body'));

// Passing a string (CSS selector)
$s = $H->select('div.foo');

// Passing an element object (DOM Element)
$s = $H->select($documentBody);

// Passing a DOM Query object
$s = $H->select( $H->select('p + p'));

// Select the body tag
$body = $H->select('body');

// Combine different classes as one selector to get all site blocks
$siteblocks = $body->select('.site-header, .masthead, .site-body, .site-footer');

// Nest your methods just like you would with jQuery
$siteblocks->select('button')->add('span')->addClass('icon icon-printer');

// Use a lambda function to set the text of all site blocks
$siteblocks->text(function( $i, $val) {
    return $i . " - " . $val->attr('class');
});

// Append the following HTML to all site blocks
$siteblocks->append('<div class="site-center"></div>');

// Use a descendant selector to select the site's footer
$sitefooter = $body->select('.site-footer > .site-center');

// Set some attributes for the site's footer
$sitefooter->attr(array('id' => 'aweeesome', 'data-val' => 'see'));

// Use a lambda function to set the attributes of all site blocks
$siteblocks->attr('data-val', function( $i, $val) {
    return $i . " - " . $val->attr('class') . " - photo by Kelly Clark";
});

// Select the parent of the site's footer
$sitefooterparent = $sitefooter->parent();

// Remove the class of all i-tags within the site's footer's parent
$sitefooterparent->select('i')->removeAttr('class');

// Wrap the site's footer within two nex selectors
$sitefooter->wrap('<section><div class="footer-wrapper"></div></section>');

[...]

সমর্থিত পদ্ধতি:

  1. সুনির্দিষ্ট কারণে renamed 'নির্বাচন'
  2. নামকরণ 'অকার্যকর', যেহেতু 'খালি' পিএইচপি একটি সংরক্ষিত শব্দ

বিঃদ্রঃ :

লাইব্রেরিতে পিএসআর -0 সামঞ্জস্যপূর্ণ লাইব্রেরিগুলির জন্য নিজস্ব শূন্য-কনফিগারেশন অটোলোডার অন্তর্ভুক্ত রয়েছে। উদাহরণ অন্তর্ভুক্ত করা হয়েছে কোন অতিরিক্ত কনফিগারেশন ছাড়াই বাক্সে কাজ করা উচিত। অন্যথায়, আপনি কম্পোজার সঙ্গে এটি ব্যবহার করতে পারেন।



এইচটিএমএল / এক্সএমএল ডোমে প্রক্রিয়া করার অনেক উপায় আছে যা সর্বাধিক উল্লেখ করা হয়েছে। অতএব, আমি তাদের নিজেকে তালিকাভুক্ত করার কোন প্রচেষ্টা করব না।

আমি কেবলমাত্র যোগ করতে চাই যে আমি ব্যক্তিগতভাবে DOM এক্সটেনশান ব্যবহার করে পছন্দ করি এবং কেন:

  • iit অন্তর্নিহিত সি কোডের কর্মক্ষমতা সুবিধা সর্বোত্তম ব্যবহার করে
  • এটি OO পিএইচপি (এবং আমাকে এটি subclass করতে পারবেন)
  • এটি বরং নিম্ন স্তরের (যা আমাকে এটি আরও উন্নত আচরণের জন্য নন-ফুটো ভিত্তি হিসাবে ব্যবহার করতে দেয়)
  • এটি DOM এর প্রতিটি অংশে অ্যাক্সেস সরবরাহ করে (উদাহরণস্বরূপ। SimpleXml যা কম পরিচিত এক্সএমএল বৈশিষ্ট্যগুলি উপেক্ষা করে)
  • এটি একটি Javascript ব্যবহৃত ব্যবহৃত সিনট্যাক্স অনুরূপ DOM ক্রলিংয়ের জন্য ব্যবহৃত একটি সিনট্যাক্স আছে।

এবং যখন আমি DOMDocument জন্য সিএসএস নির্বাচকদের ব্যবহার করার ক্ষমতা মিস করি, তখন এই বৈশিষ্ট্যটি যুক্ত করার আরও সহজ এবং সুবিধাজনক উপায় রয়েছে: DOMDocument এবং JS-like querySelectorAll এবং querySelector পদ্ধতিগুলিকে আপনার উপশ্রেণীতে যুক্ত করুন।

নির্বাচকদের প্যারিস করার জন্য, আমি সিম্ফনি ফ্রেমওয়ার্ক থেকে খুব সহজে CssSelector উপাদান ব্যবহার করার পরামর্শ দিই । এই কম্পোনেন্টটি DOMXpath সিলেক্টরগুলিকে এক্সপ্যাথ সিলেক্টরগুলিতে অনুবাদ করে, যা পরবর্তী DOMXpath পুনরুদ্ধার করতে DOMXpath খাওয়ানো যেতে পারে।

তারপরে আপনি উচ্চতর স্তরের ক্লাসগুলির জন্য একটি ভিত্তি হিসেবে এই (এখনও খুব নিম্ন স্তরের) উপশ্রেণীটি ব্যবহার করতে পারেন, যার উদ্দেশ্য হল। এক্সএমএল খুব নির্দিষ্ট ধরনের পার্স বা আরও jQuery মত আচরণ যোগ করুন।

নীচের কোডটি আমার PHPPowertools/DOM-Query সরাসরি আসে এবং আমি বর্ণিত কৌশলটি ব্যবহার করে।

এইচটিএমএল প্যারিসিং জন্য:

namespace PowerTools;

use \Symfony\Component\CssSelector\CssSelector as CssSelector;

class DOM_Document extends \DOMDocument {
    public function __construct($data = false, $doctype = 'html', $encoding = 'UTF-8', $version = '1.0') {
        parent::__construct($version, $encoding);
        if ($doctype && $doctype === 'html') {
            @$this->loadHTML($data);
        } else {
            @$this->loadXML($data);
        }
    }

    public function querySelectorAll($selector, $contextnode = null) {
        if (isset($this->doctype->name) && $this->doctype->name == 'html') {
            CssSelector::enableHtmlExtension();
        } else {
            CssSelector::disableHtmlExtension();
        }
        $xpath = new \DOMXpath($this);
        return $xpath->query(CssSelector::toXPath($selector, 'descendant::'), $contextnode);
    }

    [...]

    public function loadHTMLFile($filename, $options = 0) {
        $this->loadHTML(file_get_contents($filename), $options);
    }

    public function loadHTML($source, $options = 0) {
        if ($source && $source != '') {
            $data = trim($source);
            $html5 = new HTML5(array('targetDocument' => $this, 'disableHtmlNsInDom' => true));
            $data_start = mb_substr($data, 0, 10);
            if (strpos($data_start, '<!DOCTYPE ') === 0 || strpos($data_start, '<html>') === 0) {
                $html5->loadHTML($data);
            } else {
                @$this->loadHTML('<!DOCTYPE html><html><head><meta charset="' . $encoding . '" /></head><body></body></html>');
                $t = $html5->loadHTMLFragment($data);
                $docbody = $this->getElementsByTagName('body')->item(0);
                while ($t->hasChildNodes()) {
                    $docbody->appendChild($t->firstChild);
                }
            }
        }
    }

    [...]
}

Symfony এর CssSelector উপাদান তৈরির সিমফোনির নির্মাতা ফেবিয়ান পটেনসিয়ারের CSS সিলেক্টরগুলির সাথে XML এক্সটেনশানগুলিও পরীক্ষা করে দেখুন এবং এটি কিভাবে ব্যবহার করবেন।


এটি W3C XPath প্রযুক্তির একটি ভাল টাস্ক বর্ণনা মত শোনাচ্ছে। " <foo><bar><baz> elements মধ্যে নিছক IMG ট্যাগগুলিতে সমস্ত href বৈশিষ্ট্যগুলি ফেরত" মত প্রশ্নগুলি প্রকাশ করা সহজ। পিএইচপি বাফ নয়, এক্সপ্যাথ কি ফর্ম পাওয়া যায় তা আমি আপনাকে বলতে পারছি না। যদি আপনি HTML ফাইলটি প্রক্রিয়াকরণের জন্য একটি বহিরাগত প্রোগ্রাম কল করতে পারেন তবে আপনি XPath এর একটি কমান্ড লাইন সংস্করণ ব্যবহার করতে সক্ষম হবেন। একটি দ্রুত ভূমিকা জন্য, XPath


শুধু DOMDocument->loadHTML() ব্যবহার করুন এবং এর সাথে সম্পন্ন করা হবে। libxml এর এইচটিএমএল প্যারিসিং অ্যালগরিদম বেশ ভাল এবং দ্রুত, এবং জনপ্রিয় বিশ্বাসের বিপরীতে, বিকৃত এইচটিএমএল উপর বিরক্ত না।


স্ট্রিং phpQuery পরিবর্তে DOM ব্যবহার করে SimpleHtmlDom এর তৃতীয় পক্ষের বিকল্প: phpQuery , Zend_Dom , QueryPath এবং FluentDom


হ্যাঁ আপনি এই উদ্দেশ্যে সহজ_html_dom ব্যবহার করতে পারেন। তবে আমি simple_html_dom এর সাথে বেশ কিছু কাজ করেছি, বিশেষ করে ওয়েব স্ক্র্যাপিংয়ের জন্য এবং এটি খুব ঝুঁকিপূর্ণ বলে মনে হয়েছে। এটা মৌলিক কাজ কিন্তু আমি যে কোনভাবে এটি সুপারিশ করবে না।

আমি এই উদ্দেশ্যে কার্ল ব্যবহার করিনি কিন্তু আমি যা শিখেছি তা হল যে কার্ল কাজটি আরো দক্ষতার সাথে করতে পারে এবং আরও বেশি কঠিন।

দয়া করে এই লিঙ্কটি দেখুন: scraping-websites-with-curl


HTML5 , html5 lib এখন বছর ধরে পরিত্যক্ত হয়েছে। সাম্প্রতিক আপডেট এবং রক্ষণাবেক্ষণের রেকর্ডগুলির সাথে আমি কেবলমাত্র HTML5 লাইব্রেরী খুঁজে পেতে পারি html5-php যা একটি সপ্তাহ আগে একটু বেশি বিটা 1.0 তে আনা হয়েছিল।


Symfony ফ্রেমওয়ার্কের মধ্যে রয়েছে বান্ডেল যা এইচটিএমএল DOM করতে পারে এবং আপনি XPath ব্যবহার করার পরিবর্তে DOM নির্বাচন করতে CSS শৈলী ব্যবহার করতে পারেন।


সহজ এইচটিএমএল DOM পার্সার চেষ্টা করুন

  • পিএইচপি 5+ এ লেখা এইচটিএমএল ডম প্যাসারার যা আপনাকে এইচটিএমএলকে খুব সহজ ভাবে কাজে লাগাতে দেয়!
  • পিএইচপি 5+ প্রয়োজন।
  • অবৈধ এইচটিএমএল সমর্থন করে।
  • JQuery এর মতো নির্বাচকদের সাথে একটি HTML পৃষ্ঠায় ট্যাগগুলি খুঁজুন।
  • একটি একক লাইন এইচটিএমএল থেকে বিষয়বস্তু নিষ্কাশন করুন।
  • Download


উদাহরণ:

কিভাবে এইচটিএমএল উপাদান পেতে:

// Create DOM from URL or file
$html = file_get_html('http://www.example.com/');

// Find all images
foreach($html->find('img') as $element)
       echo $element->src . '<br>';

// Find all links
foreach($html->find('a') as $element)
       echo $element->href . '<br>';


এইচটিএমএল উপাদান পরিবর্তন কিভাবে:

// Create DOM from string
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');

$html->find('div', 1)->class = 'bar';

$html->find('div[id=hello]', 0)->innertext = 'foo';

echo $html;


এইচটিএমএল থেকে কন্টেন্ট নিষ্কাশন করুন:

// Dump contents (without tags) from HTML
echo file_get_html('http://www.google.com/')->plaintext;


স্ল্যাশড স্ক্র্যাপডট:

// Create DOM from URL
$html = file_get_html('http://slashdot.org/');

// Find all article blocks
foreach($html->find('div.article') as $article) {
    $item['title']     = $article->find('div.title', 0)->plaintext;
    $item['intro']    = $article->find('div.intro', 0)->plaintext;
    $item['details'] = $article->find('div.details', 0)->plaintext;
    $articles[] = $item;
}

print_r($articles);

অ্যাডভান্সড এইচটিএমএল ডম একটি সাধারণ এইচটিএমএল DOM প্রতিস্থাপন যা একই ইন্টারফেস সরবরাহ করে, তবে এটি DOM- ভিত্তিক যার মানে সংযুক্ত মেমরি সমস্যাগুলির মধ্যে কোনওটি ঘটে না।

এটি jQuery এক্সটেনশন সহ, সম্পূর্ণ সিএসএস সমর্থন আছে।


QueryPath ভাল, তবে "ট্র্যাকিং স্টেট" কারণটির অর্থ কী তা বুঝতে পারছেন না সে সম্পর্কে সতর্ক থাকুন, এর অর্থ হতে পারে যে কী ঘটেছে এবং কেন কোডটি কাজ করে না তা আবিষ্কার করার জন্য আপনি অনেক ডিবাগিং সময় নষ্ট করছেন।

এর অর্থ হল, ফলাফল সেটের প্রতিটি কল বস্তুতে সেট হওয়া সংশোধন সংশোধন করে, এটি জাখারির মতো শৃঙ্খলাবদ্ধ নয় যেখানে প্রতিটি লিঙ্ক একটি নতুন সেট থাকে, আপনার একটি একক সেট থাকে যা আপনার প্রশ্নের ফলাফল এবং প্রতিটি ফাংশন কল সংশোধন করে যে একক সেট।

jquery- র মতো আচরণ পেতে, আপনাকে ফিল্টার / অপারেশন মত সংশোধন করার আগে আপনাকে শাখা করতে হবে, এর অর্থ হল এটি jquery তে আরও বেশি ঘনিষ্ঠভাবে ঘটবে।

$results = qp("div p");
$forename = $results->find("input[name='forename']");

$results এখন input[name='forename'] জন্য ফলাফল সেট রয়েছে। মূল প্রশ্ন "div p" এটিকে আমার অনেক টপিক করেনি , যা আমি পাই তা হল QueryPath ফিল্টারগুলি সন্ধান করে এবং খুঁজে বের করে এবং আপনার ফলাফল এবং সঞ্চয়গুলি সংশোধন করে এমন সব কিছু সন্ধান করে বস্তু তাদের। আপনি পরিবর্তে এই কাজ করতে হবে

$forename = $results->branch()->find("input[name='forname']")

তারপরে $results সংশোধন করা হবে না এবং আপনি বার বার ফলাফল সেটটি পুনঃব্যবহার করতে পারেন, সম্ভবত আরও বেশি জ্ঞান সহকারে কেউ এটিটিকে একটু পরিষ্কার করতে পারে, তবে এটি মূলত আমি যা পেয়েছি তা থেকে এটির মতো।


আপনি নিয়মিত এক্সপ্রেশন ব্যবহার করা উচিত এবং কখন না?

প্রথম বন্ধ, একটি সাধারণ ভুলবোধক: Regexps " প্যারিসিং " HTML এর জন্য নয়। Regexes তবে " এক্সট্র্যাক্ট " তথ্য করতে পারেন। এক্সট্রাক্টিং তারা জন্য তৈরি করা হয়। সঠিক এসজিএমএল টুলকিট বা বেসলাইন এক্সএমএল পার্সারগুলির উপর রেজেক্ট এইচটিএমএল এক্সট্রাকশনটির প্রধান ত্রুটি হ'ল তাদের সিনট্যাকটিক প্রচেষ্টা এবং পরিবর্তনের নির্ভরযোগ্যতা।

একটি কিছুটা নির্ভরযোগ্য এইচটিএমএল নিষ্কাশন regex তৈরীর বিবেচনা করুন:

<a\s+class="?playbutton\d?[^>]+id="(\d+)".+?    <a\s+class="[\w\s]*title
[\w\s]*"[^>]+href="(http://[^">]+)"[^>]*>([^<>]+)</a>.+?

একটি সহজ phpQuery বা QueryPath সমতুল্য চেয়ে উপায় কম পঠনযোগ্য:

$div->find(".stationcool a")->attr("title");

তারা নির্দিষ্ট করতে পারেন তবে নির্দিষ্ট ব্যবহার ক্ষেত্রে আছে।

  • অনেক DOM ট্র্যাভেরসাল ফ্রন্টেন্ড এইচটিএমএল মন্তব্য প্রকাশ করে না <!-- , যা কখনও কখনও এক্সট্রাকশন জন্য আরো দরকারী নোঙ্গর। বিশেষভাবে ছদ্ম-এইচটিএমএল বৈচিত্র্য <$var> বা SGML অবশিষ্টাংশ regexps এর সাথে সামঞ্জস্য করা সহজ।
  • প্রায়শই নিয়মিত এক্সপ্রেশন পোস্ট প্রক্রিয়াকরণ সংরক্ষণ করতে পারেন। তবে এইচটিএমএল সত্তা প্রায়ই ম্যানুয়াল কেয়ারটেকার প্রয়োজন।
  • এবং শেষ পর্যন্ত, <img src = urls এক্সট্র্যাক্ট করার মতো ই- সহজতম সাধারণ কাজের জন্য, আসলে এটি একটি সম্ভাব্য সরঞ্জাম। এসজিএমএল / এক্সএমএল পার্সারগুলির উপর গতি সুবিধাগুলি বেশিরভাগই এই খুব মৌলিক নিষ্কাশন প্রক্রিয়ার জন্য খেলতে আসে।

নিয়মিত এক্সপ্রেশন / /<!--CONTENT-->(.+?)<!--END-->/ ব্যবহার করে এইচটিএমএল এর একটি স্নিপেট প্রাক-এক্সট্রাক্ট করার জন্য এমনকি কখনও কখনও পরামর্শ দেওয়া যায় এবং সরল HTML পার্সার ফ্রন্টেন্ডগুলি ব্যবহার করে অবশিষ্ট প্রক্রিয়াগুলি।

দ্রষ্টব্য: আমি আসলে এই app , যেখানে আমি এক্সএমএল প্যারিসিং এবং নিয়মিত এক্সপ্রেশনগুলি বিকল্পভাবে ব্যবহার করি। গত সপ্তাহে পাইগুয়ার প্যারিসিং ভেঙ্গে গেছে, এবং রেজেক্স এখনও কাজ করেছে। হ্যাঁ অদ্ভুত, এবং আমি নিজেকে ব্যাখ্যা করতে পারবেন না। কিন্তু তাই ঘটেছে।
তাই দয়া করে বাস্তব-বিশ্ব বিবেচনার ভিত্তিতে ভোট দেবেন না, কারণ এটি regex = মন্দ মেমির সাথে মেলে না। কিন্তু আসুন আমরা খুব বেশি ভোট দিই না। এটা শুধু এই বিষয়ে একটি sidenote।


আপনি যদি jQuery নির্বাচক পরিচিত হন, আপনি পিএইচপি জন্য ScarletsQuery ব্যবহার করতে পারেন

<pre><?php
include "ScarletsQuery.php";

// Load the HTML content and parse it
$html = file_get_contents('https://www.lipsum.com');
$dom = Scarlets\Library\MarkupLanguage::parseText($html);

// Select meta tag on the HTML header
$description = $dom->selector('head meta[name="description"]')[0];

// Get 'content' attribute value from meta tag
print_r($description->attr('content'));

$description = $dom->selector('#Content p');

// Get element array
print_r($description->view);

সাধারণত এই লাইব্রেরিটি অফলাইন HTML প্রক্রিয়া করতে 1 সেকেন্ডেরও কম সময় নেয়।
এটি ট্যাগ বৈশিষ্ট্যগুলিতে অবৈধ HTML বা অনুপস্থিত উদ্ধৃতিও গ্রহণ করে।


আমি HTML5 ডমডডকুমেন্ট নামে একটি লাইব্রেরি তৈরি করেছি যা অবাধে https://github.com/ivopetkov/html5-dom-document-php এ উপলব্ধhttps://github.com/ivopetkov/html5-dom-document-php

এটি ক্যোয়ারী নির্বাচকদেরও সমর্থন করে যা আমি মনে করি আপনার ক্ষেত্রে অত্যন্ত সহায়ক হবে। এখানে কিছু উদাহরণ কোড রয়েছে:

$dom = new IvoPetkov\HTML5DOMDocument();
$dom->loadHTML('<!DOCTYPE html><html><body><h1>Hello</h1><div class="content">This is some text</div></body></html>');
echo $dom->querySelector('h1')->innerHTML;




html-parsing