जवाबों:
मैं मूल XML एक्सटेंशनों में से एक का उपयोग करना पसंद करता हूं क्योंकि वे PHP के साथ आते हैं, आमतौर पर सभी 3 पार्टी के कामों से तेज होते हैं और मुझे मार्कअप के लिए आवश्यक सभी नियंत्रण प्रदान करते हैं।
DOM एक्सटेंशन आपको PHP के साथ DOM API के माध्यम से XML दस्तावेज़ों पर काम करने की अनुमति देता है। यह W3C के डॉक्यूमेंट ऑब्जेक्ट ऑब्जेक्ट माडल कोर लेवल 3, एक प्लेटफॉर्म- और भाषा-तटस्थ इंटरफ़ेस का कार्यान्वयन है जो प्रोग्राम्स और स्क्रिप्ट्स को गतिशील रूप से एक्सेस और अपडेट करने की अनुमति देता है। सामग्री, संरचना और दस्तावेजों की शैली।
DOM वास्तविक दुनिया (टूटी हुई) HTML को पार्स और संशोधित करने में सक्षम है और यह XPath क्वेरी कर सकता है । यह libxml पर आधारित है ।
DOM के साथ उत्पादक होने में कुछ समय लगता है, लेकिन यह समय IMO के लायक है। चूंकि DOM एक भाषा-अज्ञेय इंटरफ़ेस है, इसलिए आपको कई भाषाओं में कार्यान्वयन मिलेंगे, इसलिए यदि आपको अपनी प्रोग्रामिंग भाषा को बदलने की आवश्यकता है, तो संभावना है कि आपको पहले से ही पता चल जाएगा कि उस भाषा के DOM API का उपयोग कैसे किया जाए।
एक तत्व के href विशेषता को हथियाने में एक बुनियादी उपयोग उदाहरण पाया जा सकता है और php में DOMDocument में एक सामान्य वैचारिक अवलोकन पाया जा सकता है।
DOM एक्सटेंशन का उपयोग कैसे करें , StackOverflow पर बड़े पैमाने पर कवर किया गया है , इसलिए यदि आप इसका उपयोग करना चुनते हैं, तो आप सुनिश्चित कर सकते हैं कि आपके द्वारा चलाए जाने वाले अधिकांश मुद्दों को स्टैक ओवरफ़्लो खोज / ब्राउज़ करके हल किया जा सकता है।
XMLReader एक्सटेंशन एक XML पुल पार्सर है। पाठक दस्तावेज़ स्ट्रीम पर आगे बढ़ने और रास्ते में प्रत्येक नोड पर रुकने वाले कर्सर के रूप में कार्य करता है।
DOM की तरह XMLReader, libxml पर आधारित है। मुझे पता नहीं है कि HTML पार्सर मॉड्यूल को कैसे ट्रिगर किया जाए, इसलिए टूटे हुए HTML को पार्स करने के लिए XMLReader का उपयोग कर रहे हैं, हो सकता है कि आप DOM का उपयोग करने की तुलना में कम मजबूत हों, जहां आप स्पष्ट रूप से libxml के HTML पार्सर मॉड्यूल का उपयोग करने के लिए कह सकते हैं।
Ph1 का उपयोग करके h1 टैग से सभी मूल्यों को प्राप्त करने पर एक मूल उपयोग उदाहरण पाया जा सकता है
यह एक्सटेंशन आपको XML पार्सर बनाने देता है और फिर विभिन्न XML घटनाओं के लिए हैंडलर को परिभाषित करता है। प्रत्येक XML पार्सर में कुछ पैरामीटर भी होते हैं जिन्हें आप समायोजित कर सकते हैं।
XML Parser लाइब्रेरी भी libxml पर आधारित है, और एक SAX शैली XML पुश पार्सर को लागू करती है । यह DOM या SimpleXML की तुलना में मेमोरी मैनेजमेंट का एक बेहतर विकल्प हो सकता है, लेकिन XMLReader द्वारा कार्यान्वित पुल पार्सर की तुलना में काम करना अधिक कठिन होगा।
सिम्पलेक्सएक्सएमएल एक्सटेंशन एक्सएमएल को एक ऑब्जेक्ट में बदलने के लिए एक बहुत ही सरल और आसानी से उपयोग करने योग्य टूलसेट प्रदान करता है जिसे सामान्य संपत्ति चयनकर्ताओं और सरणी पुनरावृत्तियों के साथ संसाधित किया जा सकता है।
SimpleXML एक विकल्प है जब आप जानते हैं कि HTML वैध है HTML। यदि आपको टूटे हुए HTML को पार्स करने की आवश्यकता है, तो SimpleXml पर भी विचार न करें क्योंकि यह चोक हो जाएगा।
एक बुनियादी उपयोग का उदाहरण देखने पर पाया जा सकता xml फ़ाइल की CRUD नोड और नोड मूल्यों के लिए एक साधारण प्रोग्राम है और वहाँ है पीएचपी मैनुअल में अतिरिक्त उदाहरण के बहुत सारे ।
यदि आप एक 3-पक्षीय लिब का उपयोग करना पसंद करते हैं, तो मैं एक ऐसे लिब का उपयोग करने का सुझाव दूंगा, जो वास्तव में स्ट्रिंग स्ट्रिंग के बजाय DOM / libxml का उपयोग करता है ।
FluentDOM PHP में DOMDocument के लिए एक jQuery की तरह धाराप्रवाह XML इंटरफ़ेस प्रदान करता है। चयनकर्ता XPath या CSS में लिखे गए हैं (CSS से XPath कनवर्टर का उपयोग करके)। वर्तमान संस्करण डोम कार्यान्वयन मानक इंटरफेस का विस्तार करते हैं और डोम लिविंग स्टैंडर्ड से सुविधाएँ जोड़ते हैं। FluentDOM JSON, CSV, JsonML, खरगोश और अन्य जैसे प्रारूपों को लोड कर सकता है। संगीतकार के माध्यम से स्थापित किया जा सकता है।
Wa72 \ HtmlPageDom` का उपयोग करके HTML दस्तावेज़ों के आसान हेरफेर के लिए एक PHP पुस्तकालय है, जिसके लिए DOM ट्री ट्रैवर्स करने के लिए Symfony2 घटकों से DOMCrawler की आवश्यकता होती है और HTML दस्तावेज़ों के DOM ट्री में हेरफेर करने के तरीकों को जोड़कर इसे विस्तारित करता है।
phpQuery एक सर्वर-साइड, चेनेबल, CSS3 चयनकर्ता संचालित डॉक्यूमेंट ऑब्जेक्ट मॉडल (DOM) API है जो PHP5 में लिखे jQuery जावास्क्रिप्ट लाइब्रेरी पर आधारित है और अतिरिक्त कमांड लाइन इंटरफेस (सीएलआई) प्रदान करता है।
इसे भी देखें: https://github.com/electrolinux/phpquery
Zend_Dom DOM दस्तावेजों और संरचनाओं के साथ काम करने के लिए उपकरण प्रदान करता है। वर्तमान में, हम Zend_Dom_Query प्रदान करते हैं, जो XPath और CSS चयनकर्ताओं दोनों का उपयोग करते हुए DOM दस्तावेज़ों को क्वेरी करने के लिए एक एकीकृत इंटरफ़ेस प्रदान करता है।
QueryPath XML और HTML में हेरफेर करने के लिए एक PHP लाइब्रेरी है। यह न केवल स्थानीय फ़ाइलों के साथ, बल्कि वेब सेवाओं और डेटाबेस संसाधनों के साथ भी काम करने के लिए डिज़ाइन किया गया है। यह jQuery इंटरफ़ेस (सीएसएस-शैली चयनकर्ताओं सहित) के बहुत से लागू करता है, लेकिन यह सर्वर-साइड उपयोग के लिए भारी है। संगीतकार के माध्यम से स्थापित किया जा सकता है।
fDOMDocument PHP चेतावनी या नोटिस के बजाय त्रुटियों के सभी अवसरों पर अपवादों का उपयोग करने के लिए मानक DOM का विस्तार करता है। वे सुविधा के लिए और DOM के उपयोग को सरल बनाने के लिए विभिन्न कस्टम तरीके और शॉर्टकट भी जोड़ते हैं।
कृपाण / xml एक लाइब्रेरी है जो XMLReader और XMLWriter कक्षाओं को लपेटता है और विस्तारित करता है ताकि सिस्टम / डिजाइनिंग मैपिंग सिस्टम और डिज़ाइन पैटर्न के लिए एक सरल "xml" बनाया जा सके। XML लिखना और पढ़ना एकल-पास है और इसलिए तेज़ हो सकता है और बड़ी xml फ़ाइलों पर कम मेमोरी की आवश्यकता होती है।
फ्लूइडएक्सएमएल एक संक्षिप्त और धाराप्रवाह एपीआई के साथ एक्सएमएल में हेरफेर करने के लिए एक PHP पुस्तकालय है। यह XPath और धाराप्रवाह प्रोग्रामिंग पैटर्न को मज़ेदार और प्रभावी बनाता है।
DOM / libxml पर निर्माण का लाभ यह है कि आपको बॉक्स से अच्छा प्रदर्शन मिलता है क्योंकि आप मूल एक्सटेंशन पर आधारित हैं। हालांकि, सभी 3-पक्षीय देयताएं इस मार्ग से नीचे नहीं जाती हैं। उनमें से कुछ नीचे सूचीबद्ध हैं
- PHP5 में लिखा गया HTML DOM पार्सर + आपको बहुत आसान तरीके से HTML में हेरफेर करने देता है!
- PHP 5+ की आवश्यकता है।
- अमान्य HTML का समर्थन करता है।
- एक HTML पृष्ठ पर चयनकर्ताओं के साथ टैग लगाएं जैसे jQuery।
- HTML से एकल पंक्ति में सामग्री निकालें।
मैं आमतौर पर इस पार्सर की सिफारिश नहीं करता हूं। कोडबेस भयानक है और पार्सर खुद ही धीमी और स्मृति भूख है। सभी jQuery के चयनकर्ता (जैसे बाल चयनकर्ता ) संभव नहीं हैं। किसी भी लिबेक्सिलम आधारित लाइब्रेरी को आसानी से आउटपरफॉर्म करना चाहिए।
PHPHtmlParser एक सरल, लचीला, HTML पार्सर है जो आपको jQuery की तरह किसी भी सीएसएस चयनकर्ता का उपयोग करके टैग का चयन करने की अनुमति देता है। लक्ष्य उपकरण के विकास में सहायता करना है जिसके लिए html को स्क्रैप करने के लिए एक त्वरित, आसान तरीका की आवश्यकता है, चाहे वह वैध हो या न हो! यह परियोजना सुनरा / php-simple-html-dom-parser द्वारा समर्थित थी, लेकिन समर्थन बंद हो गया लगता है इसलिए यह परियोजना उनके पिछले कार्य का मेरा अनुकूलन है।
फिर, मैं इस पार्सर की सिफारिश नहीं करूंगा। यह उच्च CPU उपयोग के साथ धीमा है। निर्मित डोम ऑब्जेक्ट्स की मेमोरी को खाली करने के लिए कोई फ़ंक्शन नहीं है। ये समस्याएँ विशेष रूप से नेस्टेड छोरों के साथ होती हैं। 14 अप्रैल 16 के बाद से सुधार के लिए कोई प्रतिक्रिया नहीं होने के साथ ही दस्तावेज गलत और गलत है।
- एक सार्वभौमिक टोकन और HTML / XML / RSS DOM पार्सर
- तत्वों और उनकी विशेषताओं में हेरफेर करने की क्षमता
- अमान्य HTML और UTF8 का समर्थन करता है
- तत्वों पर उन्नत CSS3 के समान प्रश्न कर सकते हैं (जैसे jQuery - नामस्थान समर्थित)
- एक HTML ब्यूटिफायर (जैसे HTML सुव्यवस्थित)
- सीएसएस और जावास्क्रिप्ट को छोटा करें
- सॉर्ट विशेषताएँ, वर्ण मामले में परिवर्तन, सही इंडेंटेशन, आदि।
- एक्सटेंसिबल
- वर्तमान चरित्र / टोकन के आधार पर कॉलबैक का उपयोग करके दस्तावेजों को पार्स करना
- आसान ओवरराइडिंग के लिए छोटे कार्यों में संचालन अलग हो गया
- तेज और आसान
कभी इसका इस्तेमाल नहीं किया। नहीं बता सकता कि क्या यह कोई अच्छा है।
आप HTML5 को पार्स करने के लिए उपरोक्त का उपयोग कर सकते हैं, लेकिन HTML5 अनुमति मार्कअप के कारण quirks हो सकता है । तो HTML5 के लिए आप एक समर्पित पार्सर का उपयोग करने पर विचार करना चाहते हैं, जैसे
मुख्य डेस्कटॉप वेब ब्राउज़र के साथ अधिकतम संगतता के लिए WHATWG HTML5 विनिर्देशन के आधार पर HTML पार्सर का पायथन और PHP कार्यान्वयन।
HTML5 को अंतिम रूप देने के बाद हम अधिक समर्पित पार्सर देख सकते हैं। W3 के शीर्षक के लिए एक ब्लॉगपोस्ट भी है -एचटीएमएल 5 पार्सिंग के लिए हाउ-टू के लिए चेक आउट करने लायक है।
अगर आपको PHP की प्रोग्रामिंग करने का मन नहीं है, तो आप वेब सेवाओं का भी उपयोग कर सकते हैं। सामान्य तौर पर, मुझे इन के लिए बहुत कम उपयोगिता मिली, लेकिन यह सिर्फ मेरे और मेरे उपयोग के मामले हैं।
स्क्रैपरविकी का बाहरी इंटरफ़ेस आपको उस प्रपत्र में डेटा निकालने की अनुमति देता है जिसे आप वेब पर या अपने स्वयं के अनुप्रयोगों में उपयोग करना चाहते हैं। आप किसी भी खुरचन की स्थिति के बारे में भी जानकारी निकाल सकते हैं।
अंतिम और कम से कम अनुशंसित , आप नियमित अभिव्यक्ति के साथ HTML से डेटा निकाल सकते हैं । सामान्य रूप से HTML पर रेगुलर एक्सप्रेशंस का उपयोग करने से हतोत्साहित किया जाता है।
मार्कअप से मिलान करने के लिए आपको जितने भी स्निपेट मिलेंगे वे भंगुर हैं। ज्यादातर मामलों में वे केवल HTML के एक विशेष टुकड़े के लिए काम कर रहे हैं। टाइनी मार्कअप परिवर्तन, जैसे कि व्हॉट्सएप को कहीं जोड़ना, या टैग में विशेषताओं को जोड़ना या बदलना, RegEx को विफल कर सकता है जब यह ठीक से नहीं लिखा गया हो। आपको पता होना चाहिए कि आप HTML पर RegEx का उपयोग करने से पहले क्या कर रहे हैं।
HTML पार्सर पहले से ही HTML के वाक्यात्मक नियमों को जानते हैं। आपके द्वारा लिखे गए प्रत्येक नए RegEx के लिए नियमित अभिव्यक्ति सिखाई जानी चाहिए। RegEx कुछ मामलों में ठीक हैं, लेकिन यह वास्तव में आपके उपयोग-मामले पर निर्भर करता है।
आप अधिक विश्वसनीय पार्सर लिख सकते हैं , लेकिन नियमित अभिव्यक्तियों के साथ एक पूर्ण और विश्वसनीय कस्टम पार्सर लिखना समय की बर्बादी है जब पूर्वोक्त पुस्तकालय पहले से मौजूद हैं और इस पर बहुत बेहतर काम करते हैं।
Parsing Html The Cthulhu Way भी देखें
यदि आप कुछ पैसे खर्च करना चाहते हैं, तो एक नज़र डालें
मैं PHP वास्तुकार या लेखकों के साथ संबद्ध नहीं हूं।
सरल HTML डोम पार्सर की कोशिश करो
// 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);
बस DOMDocument-> loadHTML () का उपयोग करें और इसके साथ किया जाए। libxml का HTML पार्सिंग एल्गोरिथ्म काफी अच्छा और तेज है, और लोकप्रिय धारणा के विपरीत, विकृत HTML पर चोक नहीं करता है।
आपको क्यों नहीं करना चाहिए और आपको नियमित अभिव्यक्ति का उपयोग कब करना चाहिए ?
सबसे पहले, एक सामान्य मिथ्या नाम: Regexps " पार्सिंग " HTML के लिए नहीं है । Regexes हालांकि डेटा को " एक्सट्रैक्ट " कर सकता है । निकालने के लिए वे क्या कर रहे हैं। उचित SGML टूलकिट या बेसलाइन XML पार्सर पर रेगेक्स एचटीएमएल निष्कर्षण की बड़ी खामी उनके क्रमिक प्रयास और अलग-अलग विश्वसनीयता हैं।
इस बात पर विचार करें कि कुछ हद तक भरोसेमंद HTML निष्कर्षण 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");
हालांकि विशिष्ट उपयोग के मामले हैं जहां वे मदद कर सकते हैं।
<!--
, जो हालांकि कभी-कभी निष्कर्षण के लिए अधिक उपयोगी एंकर होते हैं। विशेष रूप से छद्म एचटीएमएल भिन्नरूपों <$var>
या एसजीएमएल अवशेषों को रेक्सएक्सप्स के साथ जोड़ना आसान है।यह कभी-कभी नियमित अभिव्यक्तियों का उपयोग करके HTML के एक स्निपेट को निकालने /<!--CONTENT-->(.+?)<!--END-->/
और सरल HTML पार्सर के उपयोग से शेष को संसाधित करने के लिए भी उचित है ।
नोट: मेरे पास वास्तव में यह ऐप है , जहां मैं XML पार्सिंग और नियमित अभिव्यक्ति को वैकल्पिक रूप से नियोजित करता हूं। अभी पिछले सप्ताह ही PyQuery पार्सिंग टूट गया, और रेगेक्स ने अभी भी काम किया। हाँ अजीब है, और मैं इसे खुद नहीं समझा सकता। लेकिन ऐसा हुआ।
इसलिए कृपया वास्तविक दुनिया के मतों को नीचे मत डालें, क्योंकि यह रेगेक्स = बुराई मेमे से मेल नहीं खाता है। लेकिन चलो यह भी बहुत ज्यादा मतदान नहीं करते हैं। यह इस विषय के लिए सिर्फ एक विचारधारा है।
DOMComment
टिप्पणियों को पढ़ सकते हैं, इसलिए रेगेक्स का उपयोग करने का कोई कारण नहीं है।
DOM
का उपयोग किया है और libxml का एक अलग HTML पार्सर मॉड्यूल है, जिसका उपयोग HTML लोड करते समय किया जाएगा loadHTML()
ताकि यह "वास्तविक दुनिया" (टूटी हुई) HTML को बहुत अधिक लोड कर सके।
धाराप्रवाह jQuery एपीआई की नकल करने में phpQuery और QueryPath बेहद समान हैं। यही कारण है कि वे PHP में HTML को ठीक से पार्स करने के दो सबसे आसान तरीके हैं ।
QueryPath के उदाहरण
मूल रूप से आप पहली बार HTML स्ट्रिंग से एक क्वेरी करने योग्य DOM ट्री बनाते हैं:
$qp = qp("<html><body><h1>title</h1>..."); // or give filename or URL
परिणामी ऑब्जेक्ट में HTML दस्तावेज़ का पूर्ण ट्री प्रतिनिधित्व शामिल है। यह डोम तरीकों का उपयोग करके ट्रेस किया जा सकता है। लेकिन आम तरीका jQuery में CSS चयनकर्ताओं का उपयोग करना है:
$qp->find("div.classname")->children()->...;
foreach ($qp->find("p img") as $img) {
print qp($img)->attr("src");
}
अधिकतर आप सरल #id
और .class
या DIV
टैग चयनकर्ताओं का उपयोग करना चाहते हैं ->find()
। लेकिन आप XPath स्टेटमेंट का भी उपयोग कर सकते हैं , जो कभी-कभी तेज होते हैं। इसके अलावा ठेठ jQuery के तरीकों ->children()
और ->text()
और विशेष रूप ->attr()
से सही HTML स्निपेट निकालने को सरल बनाते हैं। (और पहले से ही उनकी एसजीएमएल इकाइयां डिकोड हो गई हैं।)
$qp->xpath("//div/p[1]"); // get first paragraph in a div
QueryPath धारा में नए टैग्स को इंजेक्ट करने की भी अनुमति देता है ( ->append
), और बाद में आउटपुट और एक अद्यतन किए गए दस्तावेज़ को प्रीविटाइज़ ( ->writeHTML
) करता है। यह न केवल विकृत HTML, बल्कि विभिन्न XML बोलियों (नामस्थान के साथ) को पार्स कर सकता है, और यहां तक कि HTML माइक्रोफ़ॉर्मेट्स (XFN, vCard) से डेटा भी निकाल सकता है।
$qp->find("a[target=_blank]")->toggleClass("usability-blunder");
।
phpQuery या QueryPath?
आम तौर पर QueryPath दस्तावेजों के हेरफेर के लिए बेहतर अनुकूल है। जबकि phpQuery भी कुछ छद्म AJAX विधियों (सिर्फ HTTP अनुरोध) को अधिक बारीकी से लागू करता है jQuery से मिलता जुलता है। ऐसा कहा जाता है कि QupPath (कम समग्र विशेषताओं के कारण) से phpQuery अक्सर तेज होता है।
मतभेदों के बारे में अधिक जानकारी के लिए टैगबाइट मशीन से टैगबैक मशीन पर इस तुलना को देखें । (मूल स्रोत गायब हो गया है, इसलिए यहां एक इंटरनेट संग्रह लिंक है। हां, आप अभी भी लापता पृष्ठों, लोगों का पता लगा सकते हैं।)
और यहाँ एक व्यापक क्वेरीपथ परिचय है ।
लाभ
->find("a img, a object, div a")
साधारण HTML DOM एक बेहतरीन ओपन-सोर्स पार्सर है:
यह DOM ऑब्जेक्ट को ऑब्जेक्ट-ओरिएंटेड तरीके से व्यवहार करता है, और नए चलना में गैर-अनुपालन कोड के लिए बहुत अधिक कवरेज है। कुछ महान कार्य भी हैं जैसे आप जावास्क्रिप्ट में देखेंगे, जैसे कि "खोज" फ़ंक्शन, जो उस टैग नाम के तत्वों के सभी उदाहरणों को वापस कर देगा।
मैंने कई उपकरणों में इसका उपयोग किया है, कई अलग-अलग प्रकार के वेब पृष्ठों पर इसका परीक्षण किया है, और मुझे लगता है कि यह बहुत अच्छा काम करता है।
एक सामान्य दृष्टिकोण जो मैंने यहां नहीं देखा है , वह टीआईडी के माध्यम से HTML चलाना है , जिसे गारंटीकृत-वैध एक्सएचटीएमएल थूकने के लिए सेट किया जा सकता है। फिर आप उस पर किसी भी पुराने XML पुस्तकालय का उपयोग कर सकते हैं।
लेकिन आपकी विशिष्ट समस्या के लिए, आपको इस परियोजना पर एक नज़र डालनी चाहिए: http://fivefilters.org/content-only/ - यह पठनीयता एल्गोरिथ्म का एक संशोधित संस्करण है , जिसे केवल पाठ्य सामग्री (हेडर नहीं) को निकालने के लिए डिज़ाइन किया गया है और पाद) एक पृष्ठ से।
1 ए और 2 के लिए: मैं नए सिम्फनी कम्पोनेट वर्ग DOMCrawler ( DOMCrawler ) के लिए मतदान करूंगा । यह वर्ग CSS चयनकर्ताओं के समान प्रश्नों की अनुमति देता है। वास्तविक दुनिया उदाहरण के लिए इस प्रस्तुति पर एक नज़र डालें: खबर ऑफ द symfony2 दुनिया ।
घटक को स्टैंडअलोन काम करने के लिए डिज़ाइन किया गया है और इसका उपयोग सिम्फनी के बिना किया जा सकता है।
एकमात्र दोष यह है कि यह केवल PHP 5.3 या नए के साथ काम करेगा।
यह आमतौर पर स्क्रीन स्क्रैपिंग के रूप में संदर्भित होता है, वैसे। मैंने इसके लिए जिस लाइब्रेरी का उपयोग किया है वह सिंपल HTML डॉम पार्सर है ।
हमने पहले अपनी जरूरतों के लिए काफी क्रॉलर बनाए हैं। दिन के अंत में, यह आमतौर पर सरल नियमित अभिव्यक्ति होती है जो सबसे अच्छा काम करती है। जबकि ऊपर सूचीबद्ध पुस्तकालय उनके द्वारा बनाए गए कारण के लिए अच्छे हैं, यदि आप जानते हैं कि आप क्या देख रहे हैं, तो नियमित अभिव्यक्ति जाने का एक सुरक्षित तरीका है, क्योंकि आप गैर-वैध HTML / XHTML संरचनाओं को भी संभाल सकते हैं , जो लोड होने पर विफल हो जाएंगे अधिकांश पार्सरों के माध्यम से।
मैं PHP सरल HTML डोम पार्सर की सलाह देता हूं ।
यह वास्तव में अच्छी विशेषताएं हैं, जैसे:
foreach($html->find('img') as $element)
echo $element->src . '<br>';
यह W3C XPath तकनीक के एक अच्छे कार्य विवरण जैसा लगता है । " टैग href
में मौजूद सभी विशेषताओं को वापस लौटाएं" जैसे प्रश्नों को व्यक्त करना आसान है । PHP बफ़ नहीं होने के कारण, मैं आपको नहीं बता सकता कि XPath किस रूप में उपलब्ध हो सकता है। यदि आप HTML फ़ाइल को संसाधित करने के लिए किसी बाहरी प्रोग्राम को कॉल कर सकते हैं तो आपको XPath के कमांड लाइन संस्करण का उपयोग करने में सक्षम होना चाहिए। एक त्वरित परिचय के लिए, http://en.wikipedia.org/wiki/XPath देखें ।img
<foo><bar><baz> elements
हां आप इस उद्देश्य के लिए simple_html_dom का उपयोग कर सकते हैं। हालाँकि मैंने simple_html_dom के साथ बहुत काम किया है, विशेष रूप से वेब स्क्रैपिंग के लिए और इसे बहुत कमजोर पाया है। यह मूल काम करता है, लेकिन मैं इसे वैसे भी अनुशंसित नहीं करूंगा।
मैंने कभी भी उद्देश्य के लिए कर्ल का उपयोग नहीं किया है, लेकिन मैंने जो सीखा है वह यह है कि कर्ल बहुत अधिक कुशलता से काम कर सकता है और बहुत अधिक ठोस है।
कृपया इस लिंक को देखें: स्क्रैपिंग-वेबसाइट्स-साथ-कर्ल
QueryPath अच्छा है, लेकिन "ट्रैकिंग स्थिति" कारण से सावधान रहें यदि आपको एहसास नहीं है कि इसका क्या मतलब है, तो इसका मतलब यह हो सकता है कि आप बहुत डिबगिंग समय बर्बाद कर सकते हैं यह जानने की कोशिश करें कि क्या हुआ और क्यों कोड काम नहीं करता है।
इसका क्या अर्थ है कि परिणाम सेट पर प्रत्येक कॉल ऑब्जेक्ट में सेट किए गए परिणाम को संशोधित करता है, यह जंकरी की तरह श्रृंखला योग्य नहीं है जहां प्रत्येक लिंक एक नया सेट है, आपके पास एक सेट है जो आपकी क्वेरी से परिणाम है और प्रत्येक फ़ंक्शन कॉल संशोधित करता है वह एकल सेट।
jquery- जैसा व्यवहार पाने के लिए, आपको फ़िल्टर करने / ऑपरेशन की तरह संशोधित करने से पहले शाखा करने की आवश्यकता होती है, इसका मतलब है कि यह दर्पण होगा जो jquery में बहुत अधिक निकटता से होता है।
$results = qp("div p");
$forename = $results->find("input[name='forename']");
$results
अब परिणाम के लिए सेट input[name='forename']
नहीं है मूल क्वेरी नहीं "div p"
यह मुझे बहुत परेशान करता है , जो मैंने पाया था कि क्वेरीथ फिल्टर और पाता है और सब कुछ जो आपके परिणामों को संशोधित करता है और उन्हें ऑब्जेक्ट में संग्रहीत करता है। आपको इसके बजाय यह करने की आवश्यकता है
$forename = $results->branch()->find("input[name='forname']")
तब $results
संशोधित नहीं किया जाएगा और आप बार-बार सेट किए गए परिणाम का पुन: उपयोग कर सकते हैं, शायद बहुत अधिक ज्ञान वाला कोई व्यक्ति इसे थोड़ा साफ कर सकता है, लेकिन यह मूल रूप से इस तरह से है जैसा मैंने पाया है।
उन्नत एचटीएमएल डोम एक साधारण एचटीएमएल डोम रिप्लेसमेंट है जो समान इंटरफ़ेस प्रदान करता है, लेकिन यह डोम-आधारित है जिसका अर्थ है कि संबंधित मेमोरी में से कोई भी समस्या नहीं होती है।
इसमें jQuery एक्सटेंशन सहित पूर्ण सीएसएस समर्थन भी है ।
के लिए एचटीएमएल 5 , एचटीएमएल 5 lib अब साल के लिए त्याग दिया गया है। केवल HTML5 लाइब्रेरी जिसे मैं हाल ही में अपडेट और रखरखाव रिकॉर्ड के साथ पा सकता हूं, एचटीएमएल 5-पीएचपी है जिसे अभी एक हफ्ते पहले 1.0 बीटा बीटा में लाया गया था।
मैंने एक सामान्य उद्देश्य XML पार्सर लिखा है जो आसानी से GB फ़ाइलों को संभाल सकता है। यह XMLReader पर आधारित है और इसका उपयोग करना बहुत आसान है:
$source = new XmlExtractor("path/to/tag", "/path/to/file.xml");
foreach ($source as $tag) {
echo $tag->field1;
echo $tag->field2->subfield1;
}
यहाँ github repo: XmlExtractor है
मैंने PHPPowertools / DOM-Query नाम से एक लाइब्रेरी बनाई , जो आपको उसी तरह HTML5 और XML दस्तावेज़ों को क्रॉल करने की अनुमति देता है, जैसे आप jQuery के साथ करते हैं।
हुड के तहत, यह सीएसएस चयनकर्ताओं को XPath चयनकर्ताओं में परिवर्तित करने के लिए सिम्फनी / डोम क्रॉलर का उपयोग करता है । यह हमेशा एक ही DOMDocument का उपयोग करता है, यहां तक कि जब एक वस्तु को दूसरे के पास भेजा जाता है, तो सभ्य प्रदर्शन सुनिश्चित करने के लिए।
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>');
[...]
पुस्तकालय में PSR-0 संगत पुस्तकालयों के लिए अपना स्वयं का शून्य-विन्यास ऑटोलैडर भी शामिल है। शामिल उदाहरण को बिना किसी अतिरिक्त कॉन्फ़िगरेशन के बॉक्स से बाहर काम करना चाहिए। वैकल्पिक रूप से, आप इसे संगीतकार के साथ उपयोग कर सकते हैं।
एक और विकल्प आप कोशिश कर सकते हैं QueryPath है । यह jQuery से प्रेरित है, लेकिन PHP में सर्वर पर और Drupal में उपयोग किया जाता है ।
XML_HTMLSax
बल्कि स्थिर है - भले ही यह किसी भी अधिक बनाए रखा नहीं है। एक अन्य विकल्प यह हो सकता है कि आप HTML को Html Tidy के माध्यम से पाइप करें और फिर इसे मानक XML टूल के साथ पार्स करें।
HTML / XML DOM को प्रोसेस करने के कई तरीके हैं जिनमें से अधिकांश का उल्लेख पहले ही किया जा चुका है। इसलिए, मैं खुद को सूचीबद्ध करने का कोई प्रयास नहीं करूंगा।
मैं केवल यह जोड़ना चाहता हूं कि मैं व्यक्तिगत रूप से DOM एक्सटेंशन का उपयोग करना पसंद कर रहा हूं और क्यों:
और जब मैं सीएसएस चयनकर्ताओं का उपयोग करने की क्षमता को याद करता हूं DOMDocument
, तो इस सुविधा को जोड़ने के लिए एक सरल और सुविधाजनक तरीका है: सब-क्लासिंग DOMDocument
और जेएस-जैसे querySelectorAll
और querySelector
तरीकों को अपने उपवर्ग में जोड़ना ।
चयनकर्ताओं को पार्स करने के लिए, मैं सिम्फनी ढांचे से बहुत न्यूनतर CssSelector घटक का उपयोग करने की सलाह देता हूं । यह घटक सिर्फ CSS चयनकर्ताओं को XPath चयनकर्ताओं में अनुवाद करता है, जिसे बाद में संबंधित नोडलिस्ट को प्राप्त करने के लिए खिलाया जा सकता है ।DOMXpath
तब आप इसका उपयोग कर सकते हैं (अभी भी बहुत कम स्तर) उपवर्ग को और अधिक उच्च स्तर की कक्षाओं के लिए एक नींव के रूप में, उदाहरण के लिए। बहुत विशिष्ट प्रकार के XML को पार्स करें या अधिक jQuery की तरह व्यवहार जोड़ें।
नीचे दिया गया कोड मेरी DOM-Query लाइब्रेरी से सीधे बाहर आता है और मेरे द्वारा बताई गई तकनीक का उपयोग करता है।
HTML पार्सिंग के लिए:
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);
}
}
}
}
[...]
}
सिम्फनी के CssSelector घटक बनाने और इसका उपयोग करने के तरीके के बारे में अपने निर्णय पर सिम्फनी के निर्माता फैबिन पोटेंसीयर द्वारा सीएसएस चयनकर्ताओं के साथ पार्सिंग एक्सएमएल दस्तावेजों को भी देखें ।
FluidXML के साथ आप XPath और CSS चयनकर्ताओं का उपयोग करके XML को क्वेरी और पुनरावृति कर सकते हैं ।
$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');
});
तीन लाइनों में XML से JSON और सरणी:
$xml = simplexml_load_string($xml_string);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
ता दा!
नियमित अभिव्यक्ति द्वारा HTML को पार्स न करने के कई कारण हैं। लेकिन, यदि आपके पास HTML उत्पन्न होने का कुल नियंत्रण है, तो आप सरल नियमित अभिव्यक्ति के साथ कर सकते हैं।
ऊपर यह एक फ़ंक्शन है जो नियमित अभिव्यक्ति द्वारा HTML को पार्स करता है। ध्यान दें कि यह फ़ंक्शन बहुत संवेदनशील है और मांग करता है कि HTML कुछ नियमों का पालन करता है, लेकिन यह कई परिदृश्यों में बहुत अच्छी तरह से काम करता है। यदि आप एक साधारण पार्सर चाहते हैं, और लाइब्रेरी स्थापित नहीं करना चाहते हैं, तो इसे एक शॉट दें:
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/")));
मैंने HTML5DOMDocument नामक एक लाइब्रेरी बनाई है जो 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;
यदि आप jQuery चयनकर्ता से परिचित हैं, तो आप PHP के लिए 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 या गुम उद्धरण भी स्वीकार करता है।
पार्स xml के लिए सबसे अच्छी विधि:
$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;
}