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


উত্তর:


1896

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

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

করে DOM

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

ডিওএম রিয়েল ওয়ার্ল্ড (ভাঙা) এইচটিএমএল বিশ্লেষণ ও সংশোধন করতে সক্ষম এবং এটি এক্সপথ অনুসন্ধান করতে পারে । এটি libxML এর উপর ভিত্তি করে ।

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

একটি মৌলিক ব্যবহারের উদাহরণ একটি উপাদানটির href বৈশিষ্ট্য আঁকড়ে পাওয়া যায় এবং পিএইচপি-র ডোমডোকামেন্টে একটি সাধারণ ধারণাগত ওভারভিউ পাওয়া যায়

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

XMLReader

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

XMLReader, DOM এর মতো, libxML ভিত্তিক। এইচটিএমএল পার্সার মডিউলটি কীভাবে ট্রিগার করবেন আমি সে সম্পর্কে অবগত নই, সুতরাং ভাঙা এইচটিএমএল পার্স করার জন্য এক্সএমএলআরডার ব্যবহার করা সম্ভব হয় যেখানে ডওম ব্যবহারের চেয়ে কম শক্ত হতে পারে যেখানে আপনি স্পষ্টভাবে এটি লিবিএক্সএমএল এর এইচটিএমএল পার্সার মডিউলটি ব্যবহার করতে বলতে পারেন।

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

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

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

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

SimpleXml

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

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

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


তৃতীয় পক্ষের গ্রন্থাগারগুলি (libxML ভিত্তিক)

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

ফ্লুডডম - রেপো

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

HtmlPageDom

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

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

পিএইচপিকিউয়ারি হ'ল সার্ভার-সাইড, চেইনেবল, সিএসএস 3 নির্বাচনকারী চালিত ডকুমেন্ট অবজেক্ট মডেল (ডিওএম) এপিআই পিএইচপি 5 তে লিখিত jQuery জাভাস্ক্রিপ্ট লাইব্রেরির উপর ভিত্তি করে অতিরিক্ত কমান্ড লাইন ইন্টারফেস (সিএলআই) সরবরাহ করে।

আরও দেখুন: https://github.com/electrolinux/phpquery

Zend_Dom

জেন্ড_ডম ডিওএম ডকুমেন্টস এবং কাঠামোর সাথে কাজ করার জন্য সরঞ্জাম সরবরাহ করে। বর্তমানে, আমরা জেন্ড_ডম_কিউরি অফার করি যা এক্সপথ এবং সিএসএস নির্বাচক উভয়কেই ডিওএম নথি অনুসন্ধানের জন্য একীভূত ইন্টারফেস সরবরাহ করে।

QueryPath

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

fDOMDocument

fDOMDocament পিএইচপি সতর্কতা বা বিজ্ঞপ্তিগুলির পরিবর্তে ত্রুটিগুলির সকল ক্ষেত্রে ব্যতিক্রমগুলি ব্যবহার করতে স্ট্যান্ডার্ড ডিওএম প্রসারিত করে। তারা সুবিধার জন্য এবং ডিওএমের ব্যবহার সহজ করার জন্য বিভিন্ন কাস্টম পদ্ধতি এবং শর্টকাট যুক্ত করে।

সাবের / XML

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

FluidXML

সংক্ষিপ্ত এবং সাবলীল এপিআই সহ এক্সএমএলকে ম্যানিপুলেট করার জন্য ফ্লুইডএক্সএমএল একটি পিএইচপি গ্রন্থাগার। এটি মজাদার এবং কার্যকর হওয়ার জন্য এক্সপথ এবং সাবলীল প্রোগ্রামিং প্যাটার্নকে উপকৃত করে।


তৃতীয় পক্ষের (লিবেক্সএমএল-ভিত্তিক নয়)

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

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

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

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

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

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

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

Ganon

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

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


এইচটিএমএল 5

আপনি উপরেরটি এইচটিএমএল 5 পার্স করার জন্য ব্যবহার করতে পারেন, তবে মার্কআপের এইচটিএমএল 5 মঞ্জুরি দেওয়ার কারণে প্রশ্নগুলি হতে পারে। HTML5 এর জন্য আপনি যেমন একটি ডেডিকেটেড পার্সার ব্যবহার করে বিবেচনা করতে চান consider

html5lib

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

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


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

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

ScraperWiki

স্ক্র্যাপারউইকের বাহ্যিক ইন্টারফেস আপনাকে ওয়েবে বা আপনার নিজের অ্যাপ্লিকেশনগুলিতে ব্যবহারের জন্য যে ফর্মটি ব্যবহার করতে চান সেভাবে ডেটা উত্তোলনের অনুমতি দেয়। আপনি যে কোনও স্ক্র্যাপারের অবস্থা সম্পর্কে তথ্যও বের করতে পারেন।


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

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

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

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

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

আরো দেখুন নির্ধারণ html দ্য Cthulhu ওয়ে


বই

আপনি যদি কিছু অর্থ ব্যয় করতে চান তবে একবার দেখুন

আমি পিএইচপি স্থপতি বা লেখকদের সাথে অনুমোদিত নই।


10
@ নাভেদ যা আপনার প্রয়োজনের উপর নির্ভর করে। আমার সিএসএস সিলেক্টর ক্যোয়ারির কোনও প্রয়োজন নেই, এ কারণেই আমি এক্সপ্যাথের সাথে একচেটিয়াভাবে ডিওএম ব্যবহার করি। phpQuery একটি jQuery পোর্ট হতে লক্ষ্য। জেন্ড_ডম হালকা ওজনের। আপনি কোনটি পছন্দ করেন তা দেখতে আপনাকে সত্যই তাদের পরীক্ষা করে দেখতে হবে।
গর্ডন

2
@ এমএস 2ger বেশিরভাগ ক্ষেত্রেই, তবে সম্পূর্ণ নয়। ইতিমধ্যে উপরে উল্লিখিত মত, আপনি libxML ভিত্তিক পার্সার ব্যবহার করতে পারেন তবে এমন বিশেষ ক্ষেত্রে রয়েছে যেখানে সেগুলি দম বন্ধ করবে। আপনার যদি সর্বাধিক সামঞ্জস্যতা প্রয়োজন হয় তবে আপনি ডেডিকেটেড পার্সার দিয়ে ভাল। আমি পার্থক্য রাখতে পছন্দ করি
গর্ডন

9
পিএইচপি সিম্পল এইচটিএমএল ডম পার্সার ব্যবহার না করার জন্য আপনার পয়েন্টটি মোটা মনে হচ্ছে।
পেটাঃ

3
২৯ শে মার্চ, ২০১২ অবধি, ডিওএম এইচটিএমএল 5 সমর্থন করে না, এক্সএমএলআরডার এইচটিএমএল সমর্থন করে না এবং পিএইচপি-র জন্য এইচটিএমএল 5 লিবিতে শেষ প্রতিশ্রুতি সেপ্টেম্বর ২০০৯ এ রয়েছে। এইচটিএমএল 5, এইচটিএমএল 4 এবং এক্সএইচটিএমএল পার্স করার জন্য কী ব্যবহার করবেন?
শিপলু মোকাদ্দিম

4
@ নাশা আমি ইচ্ছাকৃতভাবে কুখ্যাত জালগো রেন্টকে উপরের তালিকা থেকে বাদ দিয়েছি কারণ এটি নিজের পক্ষে খুব বেশি সহায়ক নয় এবং এটি লেখা হওয়ার পরে বেশ কয়েকটি কার্গো কাল্টের দিকে নিয়ে যায়। সমাধান হিসাবে একটি রেইজেক্স কতটা উপযুক্ত হতে পারে তা বিবেচনা না করে লোকেরা এই লিঙ্কটি ছিটকে গেল। আরও সুষম মতামতের জন্য, দয়া করে এর পরিবর্তে আমি যে লিঙ্কটি অন্তর্ভুক্ত করেছি তা দেখুন এবং মন্তব্যগুলি স্ট্যাকওভারফ্লো
গর্ডন

322

ব্যবহার করে দেখুন সরল এইচটিএমএল করে DOM পার্সার

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


উদাহরণ:

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

// 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);

8
ভাল প্রথমত, আমার জন্য খারাপ ডিওএম, ইনলিড কোড, ডিএনএসবিএল ইঞ্জিনের বিপরীতে জেসিস বিশ্লেষণের মতো জিনিসগুলির জন্য প্রস্তুত করা দরকার, এটি দূষিত সাইট / বিষয়বস্তু সন্ধান করতেও ব্যবহৃত হবে, যেমন আমি আমার সাইটটি একটি ফ্রেমওয়ার্কের চারপাশে তৈরি করেছি এটি নির্মিত হয়েছে এটি পরিষ্কার, পাঠযোগ্য এবং সুগঠিত হওয়া দরকার। সিম্পলডিম দুর্দান্ত তবে কোডটি কিছুটা অগোছালো
রবার্টপিট

9
@ রবার্ট আপনি সুরক্ষা সম্পর্কিত বিষয়গুলির জন্য htmlpurifier.org দেখতেও চাইতে পারেন ।
গর্ডন

3
তিনি একটি বৈধ পয়েন্ট পেয়েছেন: সরল এইচটিএমএলডম প্রসারিত করা শক্ত, যদি না আপনি ডেকোরেটর প্যাটার্ন ব্যবহার করেন, যা আমি অনর্থক বলে মনে করি। আমি নিজেকে কেবল অন্তর্নিহিত শ্রেণিতে (এস) পরিবর্তন করার জন্য নিজেকে কাঁপতে দেখেছি ।
এরিক

1
আমি যা করেছি তা হ'ল সহজ HTML এ পাঠানোর আগে আমার এইচটিএমএল পরিপাটি করে চালানো হয়েছিল।
এমবি 34

1
আমি এটি বর্তমানে ব্যবহার করছি, এটি কয়েকশত ইউআরএল প্রসেস করার জন্য একটি প্রকল্পের অংশ হিসাবে এটি চালাচ্ছি। এটি খুব ধীর হয়ে উঠছে এবং নিয়মিত সময়সীমা অব্যাহত রয়েছে। এটি শিখার পক্ষে একটি দুর্দান্ত প্রাথমিক স্ক্রিপ্ট এবং স্বজ্ঞাতভাবে সহজ, তবে আরও উন্নত প্রকল্পগুলির জন্য এটি কেবল খুব প্রাথমিক।
luke_mclachlan

236

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


19
সত্য। এবং এটি পিএইচপি-র অন্তর্নির্মিত এক্সপাথ এবং এক্সএসএলটিপ্রসেসর ক্লাসগুলির সাথে কাজ করে, যা সামগ্রী উত্তোলনের জন্য দুর্দান্ত।
কর্নেল

8
সত্যই মংগড এইচটিএমএল-এর জন্য, আপনি এটি সর্বদা ডিওএম-এ দেওয়ার আগে htmltidy এর মাধ্যমে চালাতে পারেন। যখনই আমার এইচটিএমএল থেকে ডেটা স্ক্র্যাপ করা দরকার, আমি সর্বদা ডিওএম, বা কমপক্ষে সিমপ্লেক্সএমএল ব্যবহার করি।
ফ্র্যাঙ্ক ফার্মার

9
ত্রুটিযুক্ত এইচটিএমএল লোড করার সাথে অন্য একটি জিনিস যা সতর্কতাগুলি পার্স করা বন্ধ করবে তা রোধ করতে libxML_use_intern_erferences (সত্য) বলা ভাল wise
হুস্কি

6
আমি কোনও সমস্যা ছাড়াই প্রায় 1000 এইচটিএমএল উত্সগুলি (বিভিন্ন অক্ষরে এনকোড করা বিভিন্ন ভাষায়) পার্স করার জন্য ডমডকুমেন্ট ব্যবহার করেছি। আপনি এটি দিয়ে এনকোডিংয়ের সমস্যাগুলিতে দৌড়াতে পারেন তবে এগুলি দুর্গম নয়। আপনার তিনটি জিনিস জানা দরকার: 1) লোডএইচটিএমএল এনকোডিং নির্ধারণের জন্য মেটা ট্যাগের চরসেট ব্যবহার করে 2) এইচটিএমএল বিষয়বস্তুতে এই তথ্য অন্তর্ভুক্ত না করা থাকলে # 2 ভুল এনকোডিং সনাক্ত করতে পারে 3) খারাপ ইউটিএফ -8 অক্ষরগুলি পার্সারটি ভ্রমণ করতে পারে trip এই জাতীয় ক্ষেত্রে, কাজের ক্ষেত্রগুলির জন্য mb_detect_encoding () এবং সিম্পলপি আরএসএস পার্সারের এনকোডিং / রূপান্তর / স্ট্রিপিং খারাপ ইউটিএফ -8 অক্ষর কোড ব্যবহার করুন।
জিরো

1
ডোম আসলে এক্সপথকে সমর্থন করে, ডওমএক্সপাথটি একবার দেখুন ।
রায়ান ম্যাককি

147

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

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

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

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

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

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

সুনির্দিষ্ট ব্যবহারের কেস রয়েছে যেখানে তারা সহায়তা করতে পারে।

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

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

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


20
DOMCommentমন্তব্যগুলি পড়তে পারেন, সুতরাং এজন্য রেগেক্স ব্যবহার করার কোনও কারণ নেই।
গর্ডন

4
এসজিএমএল টুলকিট বা এক্সএমএল পার্সার উভয়ই রিয়েল ওয়ার্ল্ড এইচটিএমএল পার্স করার জন্য উপযুক্ত নয়। তার জন্য, কেবলমাত্র একটি ডেডিকেটেড এইচটিএমএল পার্সারই উপযুক্ত।
আলোচি

12
@ অলহসি লিবিএক্সএমএমএল DOMব্যবহার করে এবং লিবিএক্সএমএল এর একটি পৃথক এইচটিএমএল পার্সার মডিউল রয়েছে যা এইচটিএমএল লোড করার সময় ব্যবহৃত হবে loadHTML()যাতে এটি "রিয়েল-ওয়ার্ল্ড" (পড়ার ভাঙ্গা) এইচটিএমএলকে অনেক বেশি লোড করতে পারে।
গর্ডন

6
ঠিক আছে, আপনার "বাস্তব-বিশ্বের বিবেচনা" অবস্থান সম্পর্কে কেবল একটি মন্তব্য। অবশ্যই, এইচটিএমএলকে বিশ্লেষণ করার সময় রেজেজের জন্য দরকারী পরিস্থিতি রয়েছে। এবং গোটো ব্যবহারের জন্য দরকারী পরিস্থিতিও রয়েছে। এবং ভেরিয়েবল-ভেরিয়েবলের জন্য দরকারী পরিস্থিতি রয়েছে। সুতরাং এটি ব্যবহারের জন্য কোনও নির্দিষ্ট বাস্তবায়ন অবশ্যই কোড-পচা নয়। তবে এটি একটি অত্যন্ত শক্তিশালী সতর্কতা চিহ্ন। এবং গড় বিকাশকারী পার্থক্যটি জানাতে পর্যাপ্ত পরিমাণে সংখ্যক হওয়ার সম্ভাবনা নেই। সুতরাং একটি সাধারণ নিয়ম হিসাবে, রেজেক্স গোটো এবং ভেরিয়েবল-ভেরিয়েবলগুলি সমস্ত মন্দ। অ-মন্দ ব্যবহার রয়েছে, তবে সেগুলি ব্যতিক্রমগুলি (এবং এটি বিরল) ... (আইএমএইচও)
ম্যাক্সেল

11
@mario: বাস্তবিক, এইচটিএমএল পারেন 'সঠিকভাবে' regexes ব্যবহার বিশ্লেষণ হতে, যদিও সাধারণত এটি একটি ন্যায্য কাজ একটি চামচিকা করতে তাদের বিভিন্ন সময় লাগে। এটি সাধারণ ক্ষেত্রে কেবল একটি রাজকীয় ব্যথা। সুনির্দিষ্ট সংজ্ঞায়িত ইনপুট সহ নির্দিষ্ট ক্ষেত্রে এটি ক্ষুদ্রের উপরে দাঁড়ায়। এগুলি সেই ক্ষেত্রে যেগুলি লোকেরা পুনরায় চালু করা উচিত । বড় পুরানো ক্ষুধার্ত ভারী পার্সারগুলি হ'ল সাধারণ ক্ষেত্রে আপনার যা প্রয়োজন তা হ'ল যদিও নৈমিত্তিক ব্যবহারকারীর কাছে এটি লাইনটি কোথায় আঁকবেন তা সবসময় পরিষ্কার নয়। যে কোনও কোডই সহজ এবং সহজ, জিতেছে।
tchrist

131

সাবলীল jQuery এপিআই প্রতিলিপি phpQuery এবং কোয়েরিপথ অত্যন্ত অনুরূপ। এই কারণেই পিএইচপি-তে এইচটিএমএলকে সঠিকভাবে পার্স করার জন্য তারা দুটি সহজ পদ্ধতির ।

কোয়েরিপথের উদাহরণ

মূলত আপনি প্রথমে এইচটিএমএল স্ট্রিং থেকে অনুসন্ধানযোগ্য ডিওএম ট্রি তৈরি করেছেন:

 $qp = qp("<html><body><h1>title</h1>..."); // or give filename or URL

ফলস্বরূপ অবজেক্টটিতে HTML ডকুমেন্টের একটি সম্পূর্ণ গাছের প্রতিনিধিত্ব রয়েছে। এটি ডিওএম পদ্ধতি ব্যবহার করে ট্র্যাভার করা যেতে পারে। তবে সাধারণ পদ্ধতিটি হল সিএসএস নির্বাচকদের jQuery এর মতো ব্যবহার করা:

 $qp->find("div.classname")->children()->...;

 foreach ($qp->find("p img") as $img) {
     print qp($img)->attr("src");
 }

বেশিরভাগ ক্ষেত্রে আপনি এর জন্য সহজ #idএবং .classবা DIVট্যাগ নির্বাচক ব্যবহার করতে চান ->find()। তবে আপনি এক্সপথ স্টেটমেন্টগুলিও ব্যবহার করতে পারেন যা কখনও কখনও দ্রুত হয়। এছাড়াও সাধারণ জিকুয়ের পদ্ধতিগুলির মতো ->children()এবং ->text()বিশেষত ->attr()ডান এইচটিএমএল স্নিপেটগুলি উত্তোলন সহজতর করে। (এবং ইতিমধ্যে তাদের এসজিএমএল সত্তাগুলি ডিকোড হয়েছে))

 $qp->xpath("//div/p[1]");  // get first paragraph in a div

কোয়েরিপথ স্ট্রিমে নতুন ট্যাগ ইনজেকশন ( ->append), এবং পরে আউটপুট এবং একটি আপডেট নথি ( ->writeHTML) প্রিটিটিফাইও করতে দেয় । এটি কেবল ত্রুটিযুক্ত এইচটিএমএল নয়, বিভিন্ন এক্সএমএল উপভাষা (নামস্পেসগুলি সহ), এমনকি এইচটিএমএল মাইক্রোফর্ম্যাটস (এক্সএফএন, ভিকার্ড) থেকে ডেটাও বের করতে পারে।

 $qp->find("a[target=_blank]")->toggleClass("usability-blunder");

phpQuery বা কোয়েরিপথ?

সাধারণত কোয়েরিপথ নথির হেরফেরের জন্য আরও উপযুক্ত suited পিএইচপিকিউয়ারি jQuery আরও সাদৃশ্যযুক্ত করতে কিছু সিউডো এজ্যাক্স পদ্ধতি (কেবলমাত্র HTTP অনুরোধগুলি) প্রয়োগ করে। বলা হয়ে থাকে যে পিএইচপিকিউয়ারি প্রায়শই ক্যোয়ারিপথের তুলনায় দ্রুত হয় (সামগ্রিক বৈশিষ্ট্যের কম কারণেই)।

পার্থক্য সম্পর্কে আরও তথ্যের জন্য ট্যাগবিটি.অর্গ.ওয়ে থেকে ওয়েবব্যাক মেশিনে এই তুলনাটি দেখুন । (মূল উত্স নিখোঁজ হয়েছে, সুতরাং এখানে একটি ইন্টারনেট সংরক্ষণাগার লিঙ্ক রয়েছে's হ্যাঁ, আপনি এখনও নিখোঁজ পৃষ্ঠা, লোকগুলি সনাক্ত করতে পারেন))

এবং এখানে একটি বিস্তৃত কোয়েরিপথ পরিচিতি

সুবিধাদি

  • সরলতা এবং নির্ভরযোগ্যতা
  • বিকল্প ব্যবহার করা সহজ ->find("a img, a object, div a")
  • সঠিক ডেটা আনস্কেপিং (নিয়মিত এক্সপ্রেশন গ্রেপিংয়ের তুলনায়)

88

সাধারণ এইচটিএমএল ডিওএম একটি দুর্দান্ত ওপেন সোর্স পার্সার:

simplehtmldom.sourceforge

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

আমি এটি বেশ কয়েকটি সরঞ্জামে ব্যবহার করেছি, এটি বিভিন্ন ধরণের ওয়েব পৃষ্ঠায় পরীক্ষা করে দেখেছি এবং আমার মনে হয় এটি দুর্দান্ত কাজ করে works


61

একটি সাধারণ পদ্ধতির যা আমি এখানে উল্লেখ করি নি তা হল পরিশ্রমের মাধ্যমে এইচটিএমএল চালানো , যা গ্যারান্টিযুক্ত-বৈধ এক্সএইচটিএমএলকে ছাড়িয়ে যেতে পারে। তারপরে আপনি এটিতে যে কোনও পুরানো এক্সএমএল লাইব্রেরি ব্যবহার করতে পারেন।

তবে আপনার নির্দিষ্ট সমস্যার জন্য আপনার এই প্রকল্পটি একবার দেখে নেওয়া উচিত: http://fivefilters.org/content-only/ - এটি পঠনযোগ্যতা অ্যালগরিদমের একটি পরিবর্তিত সংস্করণ , যা কেবল পাঠ্য বিষয়বস্তু উত্তোলনের জন্য ডিজাইন করা হয়েছে (শিরোনাম নয়) এবং পাদচরণ) একটি পৃষ্ঠা থেকে।


56

1a এবং 2 এর জন্য: আমি নতুন সিম্ফনি কমপিউন ক্লাসের ডিওএমক্রোলার ( ডমক্রোলার ) এর পক্ষে ভোট দেব । এই শ্রেণিটি সিএসএস নির্বাচনকারীদের মতো অনুরূপ প্রশ্নের সন্ধান করে। রিয়েল-ওয়ার্ল্ড উদাহরণগুলির জন্য এই উপস্থাপনাটি দেখুন: নিউজ অফ দ্য সিমফনি 2-ওয়ার্ল্ড

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

একমাত্র ত্রুটি এটি কেবল পিএইচপি 5.3 বা আরও নতুনর সাথে কাজ করবে।


jquery- মত সিএসএস কোয়েরিগুলি ভালভাবেই বলা হয়েছে, কারণ এমন কিছু জিনিস রয়েছে যা ডাব্লু 3 সি ডকুমেন্টেশনে অনুপস্থিত তবে জ্যাকুইরিতে অতিরিক্ত বৈশিষ্ট্য হিসাবে উপস্থিত রয়েছে।
নিকোলা পেটকানস্কি

53

একে সাধারণত স্ক্রিন স্ক্র্যাপিং হিসাবে উল্লেখ করা হয় । আমি এর জন্য যে লাইব্রেরিটি ব্যবহার করেছি তা হ'ল সিম্পল এইচটিএমএল ডোম পার্সার


8
কঠোরভাবে সত্য নয় ( en.wikedia.org/wiki/Screen_scraping#Screen_scraping )। ক্লুটি "স্ক্রিনে" রয়েছে; বর্ণিত ক্ষেত্রে, কোনও স্ক্রিন জড়িত নেই। যদিও স্বীকার করেছেন, এই শব্দটি সাম্প্রতিক অপব্যবহারের ভয়াবহ আকার ধারণ করেছে।
ববি জ্যাক

4
আমি স্ক্রিন স্ক্র্যাপিং করছি না, যে বিষয়বস্তু বিশ্লেষণ করা হবে তা আমার চুক্তির অধীনে সামগ্রী সরবরাহকারী কর্তৃক অনুমোদিত হবে।
রবার্টপিট

41

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



36

এটি ডাব্লু 3 সি এক্সপথ প্রযুক্তির একটি ভাল টাস্কের বিবরণ বলে মনে হচ্ছে । "নীচে থাকা ট্যাগগুলিতে সমস্ত hrefবৈশিষ্ট্য ফিরিয়ে দিন" এর মতো প্রশ্নগুলি প্রকাশ করা সহজ । পিএইচপি বাফ না হয়ে, এক্সপ্যাথ কোন ফর্মের জন্য উপলব্ধ হতে পারে তা আমি আপনাকে বলতে পারি না। যদি আপনি এইচটিএমএল ফাইলটি প্রক্রিয়া করতে কোনও বাহ্যিক প্রোগ্রামকে কল করতে পারেন তবে আপনার এক্সপ্যাথের একটি কমান্ড লাইন সংস্করণ ব্যবহার করতে সক্ষম হওয়া উচিত। দ্রুত পরিচয়ের জন্য http://en.wikedia.org/wiki/XPath দেখুনimg<foo><bar><baz> elements


29

সিম্পলএইচটিএমএলডমের তৃতীয় পক্ষের বিকল্প যা স্ট্রিং পার্সিংয়ের পরিবর্তে ডিওএম ব্যবহার করে: পিএইচপিউকিউয়ারি , জেন্ড_ডম , কোয়েরিপ্যাথ এবং ফ্লুয়েন্টডম


3
যদি আপনি ইতিমধ্যে আমার মন্তব্যগুলি অনুলিপি করেন তবে কমপক্ষে সেগুলি যথাযথভাবে লিঙ্ক করুন;) এটি হওয়া উচিত: সিম্পিংএইচটিএমএলডমের প্রস্তাবিত তৃতীয় পক্ষের বিকল্পগুলি যা স্ট্রিং পার্সিংয়ের পরিবর্তে ডম ব্যবহার করে : পিএইচপিকিউয়ারি , জেন্ড_ডম , কোয়েরিপথ এবং ফ্লুয়েন্টডম
গর্ডন

1
ভাল উত্তর একটি দুর্দান্ত উত্স। stackoverflow.com/questions/3606792/...
danidacar

24

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

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

দয়া করে এই লিঙ্কটি দেখুন: কার্লের সাথে স্ক্র্যাপিং-ওয়েবসাইটগুলি


2
কার্ল ফাইলটি পেতে পারে তবে এটি আপনার জন্য এইচটিএমএলকে বিশ্লেষণ করবে না। এটাই শক্ত অংশ।
সিএইচও

23

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

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

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

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

$resultsএখন input[name='forename']মূল ক্যোয়ারী নয় এই ফলাফলটি "div p"আমাকে প্রচুর পরিমাণে ছড়িয়ে দিয়েছে , যা আমি পেয়েছি তা হল কোয়েরিপথগুলি ফিল্টারগুলি এবং সন্ধান করে এবং আপনার ফলাফলগুলিকে পরিবর্তন করে এবং সেটিকে বস্তুতে সংরক্ষণ করে everything পরিবর্তে আপনার এটি করা দরকার

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

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


20

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

এতে jQuery এক্সটেনশান সহ পুরো সিএসএস সমর্থন রয়েছে ।


অ্যাডভান্সড এইচটিএমএল ডম থেকে আমি ভাল ফলাফল পেয়েছি এবং আমি মনে করি এটি গৃহীত উত্তরের তালিকায় থাকা উচিত। এটির উপর নির্ভর করে যে কারও পক্ষে "এই প্রকল্পের লক্ষ্য পিএইচপি এর সহজ এইচটিএমএল ডোম লাইব্রেরির জন্য একটি ডম-ভিত্তিক ড্রপ-ইন প্রতিস্থাপন হ'ল ... আপনি যদি ফাইল / স্ট্রাইটেজ_এইচটিএমএল ব্যবহার করেন তবে আপনার প্রয়োজন হবে না কিছু পরিবর্তন করুন। " সংরক্ষণাগার.আইস / কিটসুজ# স্লেশন-933.34-933.100 হ'ল কিছু অসুবিধাগুলি সামঞ্জস্য করার জন্য আপনার কোডটিতে পরিবর্তন আনতে হতে পারে। আমি প্রকল্পের গিথুব ইস্যুতে আমার পরিচিত চারটি নোট করেছি। github.com/monkeysuffrage/advanced_html_dom/issues
ChrisJJ

কাজ করছে ! ধন্যবাদ
ফয়সাল শনি

18

এইচটিএমএল 5 এর জন্য, এইচটিএমএল 5 টি এখন বছরের পর বছর ধরে ছেড়ে দেওয়া হয়েছে। সাম্প্রতিক আপডেট এবং রক্ষণাবেক্ষণের রেকর্ডগুলির সাথে আমি কেবলমাত্র এইচটিএমএল 5 লাইব্রেরিটি খুঁজে পাচ্ছি এটি এইচটিএমএল 5 -পিএইচপি যা এক সপ্তাহ আগে একটু আগেই বিটা 1.0 এ আনা হয়েছিল।


17

আমি একটি সাধারণ উদ্দেশ্যে এক্সএমএল পার্সার লিখেছি যা সহজেই জিবি ফাইলগুলি পরিচালনা করতে পারে। এটি এক্সএমএলরেডার ভিত্তিক এবং এটি ব্যবহার করা খুব সহজ:

$source = new XmlExtractor("path/to/tag", "/path/to/file.xml");
foreach ($source as $tag) {
    echo $tag->field1;
    echo $tag->field2->subfield1;
}

এখানে গিথুব রেপো: এক্সএমএল এক্সট্রাক্টর


17

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

ফণা অধীনে, এটি ব্যবহার করে Symfony / DomCrawler সিএসএস নির্বাচক রূপান্তর জন্য জন্য XPath নির্বাচকরা। এটি সর্বদা একই ডমডোকামেন্ট ব্যবহার করে, এমনকি কোনও বস্তুর অন্যটিতে যাওয়ার সময়ও শালীন কার্যকারিতা নিশ্চিত করে।


উদাহরণ ব্যবহার:

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. 'সিলেক্ট' নামকরণ হয়েছে, সুস্পষ্ট কারণে
  2. 'শূন্য' নামকরণ করা হয়েছে, যেহেতু 'খালি' পিএইচপি-তে একটি সংরক্ষিত শব্দ

বিঃদ্রঃ :

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


কাজের জন্য সঠিক সরঞ্জামের মতো দেখে মনে হচ্ছে তবে ওয়ার্প্রেসে আমার পিএইচপি 5.6.23 এ লোড হচ্ছে না। এটি কীভাবে সঠিকভাবে অন্তর্ভুক্ত করা যায় সে সম্পর্কে কোনও অতিরিক্ত দিকনির্দেশ? এটি এর সাথে অন্তর্ভুক্ত রয়েছে: সংজ্ঞায়িত করুন ("BASE_PATH", dirname ( FILE )); সংজ্ঞায়িত করুন ("LIBRARY_PATH", BASE_PATH। DIRECTORY_SEPARATOR। 'lib / বিক্রেতা'); LIBRARY_PATH প্রয়োজন। DIRECTORY_SEPARATOR 'Loader.php'; লোডার :: ইন (অ্যারে (এলআইবিআরএআইপিএইচএইচটি, ইউজার_প্যাথ)); মধ্যে থিমের functions.php
lithiumlab

15

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



12

XML_HTMLSaxবরং স্থিতিশীল - এমনকি যদি এটি আর রক্ষণাবেক্ষণ না করা হয়। আর একটি বিকল্প হ'ল এইচটিএমএল পরিপাটি হয়ে আপনাকে এইচটিএমএল পাইপ দেওয়া এবং তারপরে স্ট্যান্ডার্ড এক্সএমএল সরঞ্জামগুলির সাহায্যে পার্স করা।


11

দ্য Symfony ফ্রেমওয়ার্ক থোকায় থোকায় যা এইচটিএমএল বিশ্লেষণ করতে পারেন, এবং আপনি নির্বাচন করতে CSS স্টাইল ব্যবহার করতে পারেন DOMs পরিবর্তে ব্যবহার করার জন্য XPath


11

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

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

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

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

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

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

নীচের কোডটি সরাসরি আমার ডোম-কোয়েরি লাইব্রেরি থেকে বেরিয়ে আসে এবং আমি বর্ণিত কৌশলটি ব্যবহার করি।

এইচটিএমএল বিশ্লেষণের জন্য:

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);
                }
            }
        }
    }

    [...]
}

আরও দেখুন CSS সিলেক্টর সঙ্গে XML দস্তাবেজগুলিতে পার্সিং Symfony জন্য CssSelector উপাদান তৈরি করতে তার সিদ্ধান্তের এবং কীভাবে ব্যবহার করতে হয় Symfony এর স্রষ্টা Fabien Potencier দ্বারা।


9

ফ্লুয়ডএক্সএমএল এর সাহায্যে আপনি এক্সপ্যাথ এবং সিএসএস নির্বাচক ব্যবহার করে এক্সএমএলকে ক্যোরি এবং পুনরাবৃত্তি করতে পারেন ।

$doc = fluidxml('<html>...</html>');

$title = $doc->query('//head/title')[0]->nodeValue;

$doc->query('//body/p', 'div.active', '#bgId')
        ->each(function($i, $node) {
            // $node is a DOMNode.
            $tag   = $node->nodeName;
            $text  = $node->nodeValue;
            $class = $node->getAttribute('class');
        });

https://github.com/servo-php/fluidxml



7

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

এর উপরে এমন একটি ফাংশন যা নিয়মিত প্রকাশের মাধ্যমে এইচটিএমএলকে পার্স করে। মনে রাখবেন যে এই ফাংশনটি অত্যন্ত সংবেদনশীল এবং দাবি করেছে যে এইচটিএমএল কিছু নির্দিষ্ট নিয়ম মানবে তবে এটি অনেক পরিস্থিতিতে খুব ভালভাবে কাজ করে। আপনি যদি একটি সাধারণ পার্সার চান এবং লাইব্রেরি ইনস্টল করতে না চান তবে এটি শট দিন:

function array_combine_($keys, $values) {
    $result = array();
    foreach ($keys as $i => $k) {
        $result[$k][] = $values[$i];
    }
    array_walk($result, create_function('&$v', '$v = (count($v) == 1)? array_pop($v): $v;'));

    return $result;
}

function extract_data($str) {
    return (is_array($str))
        ? array_map('extract_data', $str)
        : ((!preg_match_all('#<([A-Za-z0-9_]*)[^>]*>(.*?)</\1>#s', $str, $matches))
            ? $str
            : array_map(('extract_data'), array_combine_($matches[1], $matches[2])));
}

print_r(extract_data(file_get_contents("http://www.google.com/")));

2

আমি এইচটিএমএল 5 ডম ডকুমেন্ট নামে একটি গ্রন্থাগার তৈরি করেছি যা https://github.com/ivopetkov/html5-dom-docament-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;

0

আপনি যদি jQuery সিলেক্টরের সাথে পরিচিত হন তবে আপনি পিএইচপি-র জন্য স্কারলেটকুইয়ারি ব্যবহার করতে পারেন

<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);

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


0

পার্স এক্সএমএল জন্য সর্বোত্তম পদ্ধতি:

$xml='http://www.example.com/rss.xml';
$rss = simplexml_load_string($xml);
$i = 0;
foreach ($rss->channel->item as $feedItem) {
  $i++;
  echo $title=$feedItem->title;
  echo '<br>';
  echo $link=$feedItem->link;
  echo '<br>';
  if($feedItem->description !='') {
    $des=$feedItem->description;
  } else {
    $des='';
  }
  echo $des;
  echo '<br>';
  if($i>5) break;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.