सवाल PHP में HTML / XML को पार्स और प्रोसेस कैसे करते हैं?


एचटीएमएल / एक्सएमएल का विश्लेषण कैसे कर सकता है और इससे जानकारी निकाल सकता है?


1896
2017-08-26 17:19


मूल




जवाब:


मूल एक्सएमएल एक्सटेंशन

मैं इनमें से एक का उपयोग करना पसंद करते हैं देशी एक्सएमएल एक्सटेंशन चूंकि वे PHP के साथ बंडल किए जाते हैं, आमतौर पर सभी तृतीय पक्ष libs से तेज़ होते हैं और मुझे मार्कअप पर आवश्यक सभी नियंत्रण देते हैं।

डोम

डीओएम एक्सटेंशन आपको PHP 5 के साथ डीओएम एपीआई के माध्यम से एक्सएमएल दस्तावेज़ों पर काम करने की अनुमति देता है। यह डब्ल्यू 3 सी के दस्तावेज़ ऑब्जेक्ट मॉडल कोर लेवल 3, एक मंच- और भाषा-तटस्थ इंटरफ़ेस का कार्यान्वयन है जो प्रोग्राम और स्क्रिप्ट को गतिशील रूप से एक्सेस और अपडेट करने की अनुमति देता है दस्तावेजों की सामग्री, संरचना और शैली।

डोम असली दुनिया (टूटी हुई) एचटीएमएल को पार्सिंग और संशोधित करने में सक्षम है और यह कर सकता है XPath प्रश्न। यह आधारित है libxml

डीओएम के साथ उत्पादक होने में कुछ समय लगता है, लेकिन उस समय आईएमओ के लायक है। चूंकि डोम एक भाषा-अज्ञेय इंटरफ़ेस है, इसलिए आपको कई भाषाओं में कार्यान्वयन मिलेंगे, इसलिए यदि आपको अपनी प्रोग्रामिंग भाषा बदलने की ज़रूरत है, तो संभावना है कि आप पहले ही जानते होंगे कि उस भाषा के डोम एपीआई का उपयोग कैसे करें।

एक बुनियादी उपयोग उदाहरण में पाया जा सकता है ए तत्व की href विशेषता को पकड़ना और एक सामान्य वैचारिक सिंहावलोकन पर पाया जा सकता है PHP में DOMDocument

DOM एक्सटेंशन का उपयोग कैसे करें StackOverflow पर बड़े पैमाने पर कवर किया गया है, इसलिए यदि आप इसका उपयोग करना चुनते हैं, तो आप सुनिश्चित कर सकते हैं कि आपके द्वारा चलाए जाने वाले अधिकांश मुद्दों को स्टैक ओवरफ़्लो खोज / ब्राउज़ करके हल किया जा सकता है।

XMLReader

एक्सएमएल रीडर एक्सटेंशन एक एक्सएमएल पुल पार्सर है। पाठक दस्तावेज़ धारा पर आगे बढ़ने वाले कर्सर के रूप में कार्य करता है और रास्ते में प्रत्येक नोड पर रोकता है।

XMLReader, जैसे DOM, libxml पर आधारित है। मुझे एचटीएमएल पार्सर मॉड्यूल को ट्रिगर करने के बारे में पता नहीं है, तो संभावना है कि टूटी हुई एचटीएमएल को पार्स करने के लिए एक्सएमएल रीडर का उपयोग कर डीओएम का उपयोग करने से कम मजबूत हो सकता है, जहां आप इसे स्पष्ट रूप से libxml के HTML पार्सर मॉड्यूल का उपयोग करने के लिए कह सकते हैं।

एक बुनियादी उपयोग उदाहरण पर पाया जा सकता है php का उपयोग कर h1 टैग से सभी मान प्राप्त करना

एक्सएमएल पार्सर

यह एक्सटेंशन आपको XML पार्सर्स बनाने देता है और फिर विभिन्न XML ईवेंट के लिए हैंडलर परिभाषित करता है। प्रत्येक एक्सएमएल पार्सर में कुछ पैरामीटर भी होते हैं जिन्हें आप समायोजित कर सकते हैं।

एक्सएमएल पार्सर लाइब्रेरी libxml पर भी आधारित है, और एक लागू करता है SAX स्टाइल एक्सएमएल पुश पार्सर। यह डीओएम या सिंपलएक्सएमएल की तुलना में स्मृति प्रबंधन के लिए बेहतर विकल्प हो सकता है, लेकिन XMLReader द्वारा लागू पुल पार्सर की तुलना में काम करना अधिक कठिन होगा।

SimpleXML

SimpleXML एक्सटेंशन XML को किसी ऑब्जेक्ट में कनवर्ट करने के लिए एक बहुत ही सरल और आसानी से उपयोग करने योग्य टूलसेट प्रदान करता है जिसे सामान्य प्रॉपर्टी चयनकर्ताओं और सरणी इटरेटर के साथ संसाधित किया जा सकता है।

SimpleXML एक विकल्प है जब आप जानते हैं कि HTML मान्य एक्सएचटीएमएल है। यदि आपको टूटी हुई HTML को पार्स करने की आवश्यकता है, तो SimpleXml पर भी विचार न करें क्योंकि यह चकित होगा।

एक बुनियादी उपयोग उदाहरण पर पाया जा सकता है Xml फ़ाइल के CRUD नोड और नोड मानों के लिए एक सरल प्रोग्राम और वहां है PHP मैनुअल में बहुत से अतिरिक्त उदाहरण


तृतीय पक्ष पुस्तकालय (libxml आधारित)

यदि आप किसी तृतीय-पक्ष lib का उपयोग करना पसंद करते हैं, तो मैं वास्तव में उपयोग किए जाने वाले lib का उपयोग करने का सुझाव दूंगा डोम/libxml स्ट्रिंग पार्सिंग के बजाय नीचे।

FluentDom

FluentDOM PHP में DOMDocument के लिए एक jQuery- जैसे धाराप्रवाह XML इंटरफ़ेस प्रदान करता है। चयनकर्ता XPath या CSS में लिखे गए हैं (XPath कनवर्टर के लिए एक सीएसएस का उपयोग कर)। वर्तमान संस्करण डीओएम मानक इंटरफेस को कार्यान्वित करते हैं और डोम लिविंग स्टैंडर्ड से फीचर्स जोड़ते हैं। FluentDOM JSON, CSV, JsonML, RabbitFish और अन्य जैसे प्रारूप लोड कर सकता है। संगीतकार के माध्यम से स्थापित किया जा सकता है।

HtmlPageDom

W72 \ HtmlPageDom` HTML की आसान हेरफेर के लिए एक PHP लाइब्रेरी है   इसका उपयोग कर दस्तावेजों की आवश्यकता है Symfony2 से DomCrawler   अवयव ट्रैवर्सिंग के लिए   डोम पेड़ और डोम में हेरफेर करने के तरीकों को जोड़कर इसे बढ़ाता है   एचटीएमएल दस्तावेज़ों का पेड़।

phpQuery (वर्षों के लिए अद्यतन नहीं)

phpQuery PHP5 में लिखी गई jQuery जावास्क्रिप्ट लाइब्रेरी पर आधारित एक सर्वर-साइड, चेन करने योग्य, CSS3 चयनकर्ता संचालित दस्तावेज़ ऑब्जेक्ट मॉडल (डीओएम) एपीआई है और अतिरिक्त कमांड लाइन इंटरफेस (सीएलआई) प्रदान करता है।

और देखें: https://github.com/electrolinux/phpquery

Zend_Dom

Zend_Dom DOM दस्तावेज़ों और संरचनाओं के साथ काम करने के लिए टूल प्रदान करता है। वर्तमान में, हम Zend_Dom_Query प्रदान करते हैं, जो XPath और CSS चयनकर्ताओं का उपयोग करने वाले डीओएम दस्तावेजों की पूछताछ के लिए एक एकीकृत इंटरफ़ेस प्रदान करता है।

QueryPath

QueryPath XML और HTML में हेरफेर करने के लिए एक PHP लाइब्रेरी है। यह न केवल स्थानीय फाइलों के साथ ही वेब सेवाओं और डेटाबेस संसाधनों के साथ काम करने के लिए डिज़ाइन किया गया है। यह अधिकांश jQuery इंटरफ़ेस (सीएसएस-स्टाइल चयनकर्ताओं सहित) लागू करता है, लेकिन सर्वर-साइड उपयोग के लिए इसे बहुत अधिक ट्यून किया जाता है। संगीतकार के माध्यम से स्थापित किया जा सकता है।

fDOMDocument

fDOMDocument मानक चेतावनी को PHP चेतावनियों या नोटिस के बजाय त्रुटियों के सभी अवसरों पर अपवादों का उपयोग करने के लिए बढ़ाता है। वे सुविधा के लिए विभिन्न कस्टम तरीकों और शॉर्टकट भी जोड़ते हैं और डीओएम के उपयोग को सरल बनाते हैं।

कृपाण / xml

saber / xml एक लाइब्रेरी है जो एक्सएमएल रीडर और एक्सएमएलवाइटर कक्षाओं को एक सरल "एक्सएमएल टू ऑब्जेक्ट / सरणी" मैपिंग सिस्टम और डिज़ाइन पैटर्न बनाने के लिए लपेटती है और विस्तारित करती है। एक्सएमएल लिखना और पढ़ना एकल-पास है और इसलिए तेज़ हो सकता है और बड़ी एक्सएमएल फाइलों पर कम मेमोरी की आवश्यकता होती है।

FluidXML

FluidXML एक संक्षिप्त और धाराप्रवाह एपीआई के साथ एक्सएमएल में हेरफेर करने के लिए एक PHP लाइब्रेरी है।   यह XPath और धाराप्रवाह प्रोग्रामिंग पैटर्न को मजेदार और प्रभावी बनाने का लाभ उठाता है।


तृतीय पक्ष (libxml- आधारित नहीं)

डीओएम / libxml पर निर्माण का लाभ यह है कि आपको बॉक्स से अच्छा प्रदर्शन मिलता है क्योंकि आप मूल एक्सटेंशन पर आधारित होते हैं। हालांकि, इस मार्ग से सभी तीसरे पक्ष के libs नीचे नहीं जाते हैं। उनमें से कुछ नीचे सूचीबद्ध हैं

PHP सरल एचटीएमएल डोम पार्सर

  • PHP5 + में लिखा गया एक HTML डोम पार्सर आपको HTML को एक बहुत ही आसान तरीके से हेरफेर करने देता है!
  • PHP 5+ की आवश्यकता है।
  • अवैध HTML का समर्थन करता है।
  • JQuery की तरह चयनकर्ताओं के साथ एक HTML पृष्ठ पर टैग खोजें।
  • एक पंक्ति में एचटीएमएल से सामग्री निकालें।

मैं आमतौर पर इस पार्सर की सिफारिश नहीं करता हूं। कोडेबेस बहुत भयानक है और पार्सर स्वयं धीमा और स्मृति भूख लगी है। सभी jQuery चयनकर्ता नहीं (जैसे बाल चयनकर्ता) संभव हैं। Libxml आधारित पुस्तकालयों में से कोई भी इसे आसानी से बेहतर प्रदर्शन करना चाहिए।

PHP एचटीएमएल पार्सर

PHPHtmlParser एक साधारण, लचीला, एचटीएमएल पार्सर है जो आपको jQuery की तरह किसी भी सीएसएस चयनकर्ता का उपयोग करके टैग का चयन करने की अनुमति देता है। लक्ष्य उन उपकरणों के विकास में सहायता करना है, जिन्हें HTML को स्क्रैप करने का एक त्वरित, आसान तरीका चाहिए, चाहे वह मान्य है या नहीं! यह प्रोजेक्ट मूल रूप से सनरा / php-simple-html-dom-parser द्वारा समर्थित था लेकिन समर्थन बंद हो गया है, इसलिए यह प्रोजेक्ट मेरे पिछले काम का अनुकूलन है।

दोबारा, मैं इस पार्सर की सिफारिश नहीं करता। यह उच्च CPU उपयोग के साथ धीमा है। बनाई गई DOM ऑब्जेक्ट्स की स्मृति को साफ़ करने के लिए कोई फ़ंक्शन भी नहीं है। ये समस्याएं विशेष रूप से नेस्टेड लूप के साथ स्केल करती हैं। प्रलेखन स्वयं गलत और गलत वर्तनी है, 14 अप्रैल 16 के बाद से कोई फिक्स नहीं पड़ता है।

Ganon

  • एक सार्वभौमिक टोकनाइज़र और एचटीएमएल / एक्सएमएल / आरएसएस डोम पार्सर      
    • तत्वों और उनके गुणों में हेरफेर करने की क्षमता
    • अमान्य HTML और UTF8 का समर्थन करता है
  • तत्वों पर उन्नत CSS3 जैसी क्वेरी कर सकते हैं (जैसे jQuery - नेमस्पेस समर्थित)
  • एक एचटीएमएल ब्यूटीफायर (जैसे एचटीएमएल टिडी)      
    • सीएसएस और जावास्क्रिप्ट को छोटा करें
    • सॉर्ट करें गुण, चरित्र केस बदलें, सही इंडेंटेशन इत्यादि।
  • एक्सटेंसिबल      
    • वर्तमान चरित्र / टोकन के आधार पर कॉलबैक का उपयोग कर दस्तावेज़ों को पार्स करना
    • आसान ओवरराइडिंग के लिए छोटे कार्यों में ऑपरेशन अलग-अलग होते हैं
  • तेज़ और आसान

कभी इसका इस्तेमाल नहीं किया। यह नहीं बता सकता कि यह कोई अच्छा है या नहीं।


एचटीएमएल 5

आप उपरोक्त का उपयोग एचटीएमएल 5 पार्स करने के लिए कर सकते हैं, लेकिन quirks हो सकता है मार्कअप एचटीएमएल 5 की अनुमति देता है। तो एचटीएमएल 5 के लिए आप एक समर्पित पार्सर का उपयोग करने पर विचार करना चाहते हैं, जैसे

html5lib

प्रमुख डेस्कटॉप वेब ब्राउज़र के साथ अधिकतम संगतता के लिए WHATWG HTML5 विनिर्देश के आधार पर एक HTML पार्सर का एक पायथन और PHP कार्यान्वयन।

एक बार एचटीएमएल 5 को अंतिम रूप देने के बाद हम अधिक समर्पित पार्सर्स देख सकते हैं। W3 के शीर्षक से एक ब्लॉगपोस्ट भी है एचटीएमएल 5 पार्सिंग के लिए कैसे करें यह जांचने लायक है।


वेब सेवाएं

यदि आप प्रोग्रामिंग PHP की तरह महसूस नहीं करते हैं, तो आप वेब सेवाओं का भी उपयोग कर सकते हैं। आम तौर पर, मुझे इनके लिए बहुत कम उपयोगिता मिली, लेकिन यह सिर्फ मुझे और मेरे उपयोग के मामले हैं।

YQL

वाईक्यूएल वेब सेवा इंटरनेट पर विभिन्न स्रोतों से डेटा को क्वेरी, फ़िल्टर और गठबंधन करने में सक्षम बनाता है। वाईक्यूएल कथन में एसक्यूएल-जैसी सिंटैक्स है, जो डेटाबेस अनुभव के साथ किसी भी डेवलपर से परिचित है।

ScraperWiki

स्क्रैपविकि का बाहरी इंटरफ़ेस आपको उस फ़ॉर्म में डेटा निकालने की अनुमति देता है जिसे आप वेब पर या अपने स्वयं के अनुप्रयोगों में उपयोग के लिए चाहते हैं। आप किसी भी स्क्रैपर की स्थिति के बारे में जानकारी निकाल सकते हैं।


नियमित अभिव्यक्ति

अंतिम और कम से कम अनुशंसित, आप एचटीएमएल से डेटा निकाल सकते हैं नियमित अभिव्यक्ति। आम तौर पर एचटीएमएल पर नियमित अभिव्यक्तियों का उपयोग करके निराश किया जाता है।

मार्कअप से मेल खाने के लिए वेब पर पाए जाने वाले अधिकांश स्निपेट भंगुर होते हैं। ज्यादातर मामलों में वे केवल HTML के एक विशेष टुकड़े के लिए काम कर रहे हैं। छोटे मार्कअप परिवर्तन, कहीं भी व्हाइटस्पेस जोड़ने, या टैग में विशेषताओं को जोड़ने या बदलने से, RegEx ठीक से लिखा नहीं जाने पर विफल हो सकता है। HTML पर RegEx का उपयोग करने से पहले आपको पता होना चाहिए कि आप क्या कर रहे हैं।

एचटीएमएल पार्सर्स पहले ही एचटीएमएल के सिंटैक्टिकल नियमों को जानते हैं। आपके द्वारा लिखे गए प्रत्येक नए RegEx के लिए नियमित अभिव्यक्तियों को पढ़ाया जाना चाहिए। कुछ मामलों में RegEx ठीक है, लेकिन यह वास्तव में आपके उपयोग-मामले पर निर्भर करता है।

आप अधिक विश्वसनीय पार्सर्स लिख सकते हैं, लेकिन एक लिखना पूर्ण और भरोसेमंद नियमित अभिव्यक्तियों के साथ कस्टम पार्सर समय की बर्बादी है जब उपर्युक्त पुस्तकालय पहले से मौजूद हैं और इस पर एक बेहतर काम करते हैं।

और देखें पाथिंग एचटीएमएल कथुलू वे


पुस्तकें

यदि आप कुछ पैसे खर्च करना चाहते हैं, तो एक नज़र डालें

मैं PHP वास्तुकार या लेखकों से संबद्ध नहीं हूं।


1719
2017-08-26 17:18



@Naveed जो आपकी जरूरतों पर निर्भर करता है। मुझे सीएसएस चयनकर्ता प्रश्नों की कोई आवश्यकता नहीं है, यही कारण है कि मैं विशेष रूप से XPath के साथ डोम का उपयोग करता हूं। phpQuery का उद्देश्य एक jQuery पोर्ट होना है। Zend_Dom हल्का वजन है। आपको वास्तव में यह देखना होगा कि आपको कौन सा सबसे अच्छा पसंद है। - Gordon
PHP सरल HTML डोम पार्सर का उपयोग न करने के लिए आपका बिंदु म्यूट लगता है। - Petah
2 9 मार्च, 2012 तक, डोम एचटीएमएल 5 का समर्थन नहीं करता है, एक्सएमएल रीडर एचटीएमएल का समर्थन नहीं करता है और PHP के लिए एचटीएमएल 5 एलआईबी पर अंतिम प्रतिबद्धता सितंबर 200 9 को है। एचटीएमएल 5, एचटीएमएल 4 और एक्सएचटीएमएल का विश्लेषण करने के लिए क्या उपयोग करें? - Shiplu Mokaddim
@ जिमी इसमें कर्ल के बारे में कुछ भी शामिल नहीं है क्योंकि curl एचटीएमएल / एक्सएमएल के साथ पार्स और प्रक्रिया करने के लिए एक उपकरण नहीं है। curl विभिन्न नेटवर्क प्रोटोकॉल के लिए एक ग्राहक है। उदाहरण के लिए, आप इसके साथ वेबसाइटें ला सकते हैं। उपरोक्त अधिकांश पुस्तकालयों में दूरस्थ URL सीधे लोड करने के तरीके हैं, इसलिए आपको कर्ल की आवश्यकता नहीं है, उदाहरण के लिए डीओएम loadHTMLFile()। - Gordon
@ नशा मैंने जानबूझकर उपरोक्त सूची से कुख्यात ज़ल्गो रान को बाहर कर दिया क्योंकि यह स्वयं के लिए बहुत उपयोगी नहीं है और इसे लिखा जाने के बाद से कुछ कार्गो पंथ का कारण बनता है। लोगों को उस लिंक के साथ थप्पड़ मार दिया गया था इससे कोई फर्क नहीं पड़ता कि समाधान के रूप में रेगेक्स कितना उचित होगा। अधिक संतुलित राय के लिए, कृपया लिंक I देखें किया इसके बजाय शामिल करें और टिप्पणियों के माध्यम से जाओ stackoverflow.com/questions/4245008/... - Gordon


प्रयत्न सरल एचटीएमएल डोम पार्सर

  • PHP 5+ में लिखा गया एक HTML डोम पार्सर जो आपको HTML को एक बहुत ही आसान तरीके से हेरफेर करने देता है!
  • PHP 5+ की आवश्यकता है।
  • अवैध HTML का समर्थन करता है।
  • JQuery की तरह चयनकर्ताओं के साथ एक 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>';


HTML तत्वों को कैसे संशोधित करें:

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

303
2017-11-26 20:02



खैर सबसे पहले ऐसी चीजें हैं जिन्हें मुझे खराब डॉम, इनक्लिड कोड, जेएसबीएल इंजन के खिलाफ विश्लेषण करने के लिए तैयार करने की आवश्यकता है, इसका उपयोग दुर्भावनापूर्ण साइट्स / सामग्री के लिए भी किया जाएगा, जैसा कि मैंने अपनी साइट को ढांचे के चारों ओर बनाया है। इसे साफ, पठनीय और अच्छी तरह से संरचित होने की जरूरत है। SimpleDim बहुत अच्छा है लेकिन कोड थोड़ा गन्दा है - RobertPitt
@Robert आप भी जांचना चाहते हैं htmlpurifier.org सुरक्षा से संबंधित चीजों के लिए। - Gordon
उसे एक वैध बिंदु मिल गया है: सरल HTMLDOM का विस्तार करना मुश्किल है, जब तक कि आप सजावटी पैटर्न का उपयोग न करें, जो मुझे अनावश्यक लगता है। मैंने खुद को पाया है कंपकंपी केवल अंतर्निहित वर्ग (एस) में परिवर्तन करना। - Erik
मैंने जो किया वह सरल HTML पर भेजने से पहले मेरे एचटीएमएल को साफ कर रहा था। - MB34
मैं वर्तमान में इसका उपयोग कर रहा हूं, इसे कुछ सौ यूआरएल संसाधित करने के लिए प्रोजेक्ट के हिस्से के रूप में चला रहा हूं। यह बहुत धीमा हो रहा है और नियमित टाइमआउट जारी है। यह एक महान शुरुआत करने वाली स्क्रिप्ट है और सीखने के लिए सहजता से सरल है, लेकिन अधिक उन्नत परियोजनाओं के लिए बहुत ही बुनियादी है। - luke_mclachlan


महज प्रयोग करें DOMDocument-> loadHTML () और इसके साथ किया जाना चाहिए। libxml का HTML पार्सिंग एल्गोरिदम काफी अच्छा और तेज़ है, और लोकप्रिय धारणा के विपरीत, विकृत HTML पर नहीं दबाता है।


224
2017-11-15 22:16



सच। और यह PHP के अंतर्निहित XPath और XSLTProcessor कक्षाओं के साथ काम करता है, जो सामग्री निकालने के लिए बहुत अच्छे हैं। - Kornel
वास्तव में उलझन में एचटीएमएल के लिए, आप हमेशा इसे डीओएम को सौंपने से पहले एचटीएमएलटीडी के माध्यम से चला सकते हैं। जब भी मुझे HTML से डेटा स्क्रैप करने की आवश्यकता होती है, तो मैं हमेशा डीओएम, या कम से कम सरल xml का उपयोग करता हूं। - Frank Farmer
विकृत HTML को लोड करने के साथ एक और चीज है कि मुझे चेतावनी रोकने के लिए libxml_use_internal_errors (true) को कॉल करना बुद्धिमान हो सकता है जो पार्सिंग को रोक देगा। - Husky
मैंने किसी भी मुद्दे के बिना 1000 एचटीएमएल स्रोतों (अलग-अलग भाषाओं में एन्कोड किए गए विभिन्न भाषाओं में) को पार्स करने के लिए डॉमडोक्यूमेंट का उपयोग किया है। आप इसके साथ एन्कोडिंग समस्याओं में भाग सकते हैं, लेकिन वे दुर्बल नहीं हैं। आपको 3 चीजों को जानने की जरूरत है: 1) लोड एचटीएमएल एन्कोडिंग निर्धारित करने के लिए मेटा टैग के वर्णसेट का उपयोग करता है 2) # 2 गलत सामग्री एन्कोडिंग पहचान का कारण बन सकता है यदि HTML सामग्री में यह जानकारी शामिल नहीं है 3) खराब यूटीएफ -8 वर्ण पार्सर की यात्रा कर सकते हैं। ऐसे मामलों में, mb_detect_encoding () और सिंपलपी आरएसएस पार्सर के एन्कोडिंग / कन्वर्टिंग / वर्कअराउंड के लिए खराब यूटीएफ -8 वर्ण कोड को अलग करने के संयोजन का उपयोग करें। - Zero
डोम वास्तव में XPath का समर्थन करता है, एक नज़र डालें DOMXPath। - Ryan McCue


आपको क्यों नहीं चाहिए और क्यों जब आपको करना चाहिए नियमित अभिव्यक्तियों का प्रयोग करें?

सबसे पहले, एक आम गलत नामक: Regexps के लिए नहीं हैं "पदच्छेद" एचटीएमएल। Regexes हालांकि कर सकते हैं "उद्धरण" डेटा। निकालने के लिए वे क्या बना रहे हैं। उचित एसजीएमएल टूलकिट्स या बेसलाइन एक्सएमएल पार्सर्स पर रेगेक्स एचटीएमएल निष्कर्षण की बड़ी कमी उनके वाक्य रचनात्मक प्रयास और विभिन्न विश्वसनीयता हैं।

विचार करें कि कुछ हद तक भरोसेमंद 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> या एसजीएमएल अवशेष regexps के साथ tame आसान है।
  • अक्सर नियमित अभिव्यक्ति पोस्ट प्रोसेसिंग को बचा सकते हैं। हालांकि एचटीएमएल इकाइयों को अक्सर मैन्युअल देखभाल करने की आवश्यकता होती है।
  • और आखिरकार, ई के लिएबेहद सरल कार्य <img src = urls निकालने की तरह, वे वास्तव में एक संभावित उपकरण हैं। एसजीएमएल / एक्सएमएल पार्सर्स पर गति लाभ ज्यादातर इन बुनियादी निष्कर्षण प्रक्रियाओं के लिए खेलने के लिए आता है।

कभी-कभी नियमित अभिव्यक्तियों का उपयोग करके HTML के स्निपेट को पूर्व-निकालने के लिए भी सलाह दी जाती है /<!--CONTENT-->(.+?)<!--END-->/और सरल HTML पार्सर फ्रंटेंड का उपयोग करके शेष को संसाधित करें।

ध्यान दें: मैं वास्तव में यह है एप्लिकेशन, जहां मैं वैकल्पिक रूप से एक्सएमएल पार्सिंग और नियमित अभिव्यक्तियों को नियोजित करता हूं। पिछले हफ्ते PyQuery पार्सिंग तोड़ दिया, और regex अभी भी काम किया। हाँ अजीब, और मैं इसे खुद समझा नहीं सकता। लेकिन ऐसा हुआ।
तो कृपया असली दुनिया के विचारों को मत छोड़ो, सिर्फ इसलिए कि यह regex = बुराई meme से मेल नहीं खाता है। लेकिन चलिए इसे भी ज्यादा वोट नहीं देते हैं। यह इस विषय के लिए सिर्फ एक sidenote है।


136
2018-05-01 02:04



DOMComment टिप्पणियां पढ़ सकते हैं, इसलिए इसके लिए रेगेक्स का उपयोग करने का कोई कारण नहीं है। - Gordon
न तो एसजीएमएल टूलकिट्स या एक्सएमएल पार्सर्स असली दुनिया एचटीएमएल पार्स करने के लिए उपयुक्त हैं। इसके लिए, केवल एक समर्पित HTML पार्सर उपयुक्त है। - Alohci
@Alohci DOM का उपयोग करता है libxml तथा libxml एक अलग HTML पार्सर है मॉड्यूल जिसका उपयोग HTML के साथ लोड करते समय किया जाएगा loadHTML() इसलिए यह बहुत वास्तविक "वास्तविक दुनिया" (टूटा हुआ) HTML लोड कर सकता है। - Gordon
खैर, बस आपके "असली दुनिया विचार" दृष्टिकोण के बारे में एक टिप्पणी। निश्चित रूप से, HTML को पार्स करते समय Regex के लिए उपयोगी स्थितियां हैं। और गोटो का उपयोग करने के लिए भी उपयोगी स्थितियां हैं। और चर-चर के लिए उपयोगी स्थितियां हैं। तो इसका उपयोग करने के लिए कोई विशेष कार्यान्वयन निश्चित रूप से कोड-सड़ांध नहीं है। लेकिन यह एक बहुत ही मजबूत चेतावनी संकेत है। और औसत डेवलपर को अंतर बताने के लिए पर्याप्त नीच होने की संभावना नहीं है। तो एक सामान्य नियम के रूप में, रेगेक्स गोटो और वेरिएबल-वेरिएबल्स सभी बुराई हैं। गैर-बुरे उपयोग हैं, लेकिन वे अपवाद हैं (और उस पर दुर्लभ) ... (आईएमएचओ) - ircmaxell
@ मारियो: असल में, एचटीएमएल कर सकते हैं regexes का उपयोग करके 'ठीक से' पार्स किया जाए, हालांकि आम तौर पर उनमें से कई को एक उचित नौकरी करने के लिए एक शीर्षक लगता है। यह सामान्य मामले में सिर्फ शाही दर्द है। अच्छी तरह से परिभाषित इनपुट के साथ विशिष्ट मामलों में, यह मामूली पर verges। वे लोग हैं जो लोग हैं चाहिए regexes का उपयोग कर रहे हैं। बड़े पुराने भूख भारी पार्सर्स वास्तव में आपको सामान्य मामलों के लिए आवश्यक हैं, हालांकि यह उस प्रासंगिक उपयोगकर्ता को हमेशा स्पष्ट नहीं है जहां उस रेखा को आकर्षित किया जाए। जो भी कोड सरल और आसान है, जीतता है। - tchrist


phpQuery तथा QueryPath धाराप्रवाह jQuery एपीआई की नकल करने में बेहद समान हैं। यही कारण है कि वे दो सबसे आसान दृष्टिकोण हैं अच्छी तरह PHP में एचटीएमएल पार्स।

QueryPath के लिए उदाहरण

मूल रूप से आप पहले एक HTML स्ट्रिंग से एक क्वेरी करने योग्य DOM पेड़ बनाते हैं:

 $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()। लेकिन आप भी उपयोग कर सकते हैं XPath बयान, जो कभी-कभी तेज़ होते हैं। इसके अलावा सामान्य jQuery विधियों की तरह ->children() तथा ->text() और विशेष रूप से ->attr() सही HTML स्निपेट निकालने को सरल बनाएं। (और पहले से ही उनके एसजीएमएल इकाइयां डीकोड की गई हैं।)

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

QueryPath भी स्ट्रीम में नए टैग इंजेक्शन की अनुमति देता है (->append), और बाद में एक अद्यतन दस्तावेज आउटपुट और सुंदरता (->writeHTML)। यह न केवल विकृत HTML को पार्स कर सकता है, बल्कि विभिन्न एक्सएमएल बोलीभाषाओं (नामस्थानों के साथ), और एचटीएमएल माइक्रोफॉर्मेट्स (एक्सएफएन, वीकार्ड) से भी डेटा निकाल सकता है।

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

phpQuery या QueryPath?

आम तौर पर क्वेरी के हेरफेर के लिए क्वेरीरीथ बेहतर अनुकूल है। जबकि phpQuery भी कुछ छद्म AJAX विधियों (केवल HTTP अनुरोध) को jQuery के समान दिखने के लिए लागू करता है। ऐसा कहा जाता है कि phpQuery अक्सर QueryPath से अधिक तेज़ है (कम समग्र सुविधाओं की वजह से)।

मतभेदों के बारे में अधिक जानकारी के लिए देखें tagbyte.org से वेबैक मशीन पर यह तुलना। (मूल स्रोत गायब हो गया, इसलिए यहां एक इंटरनेट संग्रह लिंक है। हाँ, आप अभी भी गायब पृष्ठों, लोगों का पता लगा सकते हैं।)

और यहाँ है एक व्यापक क्वेरीपैथ परिचय

लाभ

  • सरलता और विश्वसनीयता
  • विकल्पों का उपयोग करने के लिए सरल ->find("a img, a object, div a")
  • उचित डेटा अनदेखा (नियमित अभिव्यक्ति grepping की तुलना में)

126
2017-08-26 17:20





सरल एचटीएमएल डोम एक महान ओपन-सोर्स पार्सर है:

simplehtmldom.sourceforge

यह किसी ऑब्जेक्ट उन्मुख तरीके से डीओएम तत्वों का इलाज करता है, और नए पुनरावृत्ति में गैर-अनुपालन कोड के लिए बहुत से कवरेज हैं। जावास्क्रिप्ट में कुछ शानदार कार्य भी हैं, जैसे कि "ढूंढें" फ़ंक्शन, जो उस टैग नाम के तत्वों के सभी उदाहरण वापस कर देगा।

मैंने इसे कई टूल में इस्तेमाल किया है, इसे कई अलग-अलग प्रकार के वेब पृष्ठों पर परीक्षण किया है, और मुझे लगता है कि यह बहुत अच्छा काम करता है।


85
2017-10-04 13:14





यहां उल्लेख किया गया एक सामान्य दृष्टिकोण HTML के माध्यम से चलाने के लिए है साफ, जिसे गारंटीकृत-वैध एक्सएचटीएमएल थूकने के लिए सेट किया जा सकता है। फिर आप उस पर किसी भी पुराने एक्सएमएल लाइब्रेरी का उपयोग कर सकते हैं।

लेकिन आपकी विशिष्ट समस्या के लिए, आपको इस परियोजना को देखना चाहिए: http://fivefilters.org/content-only/ - यह एक संशोधित संस्करण है पठनीयता एल्गोरिदम, जिसे किसी पृष्ठ से केवल पाठ्य सामग्री (शीर्षलेख और पाद लेख नहीं) निकालने के लिए डिज़ाइन किया गया है।


58
2017-11-06 21:02





1 ए और 2 के लिए: मैं नई सिम्फनी कंपोनेट क्लास डोमक्रॉलर के लिए वोट दूंगा ( DomCrawler )। यह वर्ग सीएसएस चयनकर्ताओं के समान प्रश्नों की अनुमति देता है। असली दुनिया के उदाहरणों के लिए इस प्रस्तुति पर नज़र डालें: खबर के-symfony2 दुनिया

घटक स्टैंडअलोन काम करने के लिए डिज़ाइन किया गया है और सिम्फनी के बिना इसका उपयोग किया जा सकता है।

एकमात्र कमी यह है कि यह केवल PHP 5.3 या नए के साथ काम करेगा।


54
2018-04-14 19:08



jquery-like css प्रश्नों को अच्छी तरह से कहा जाता है, क्योंकि कुछ चीजें हैं जो w3c प्रलेखन में अनुपलब्ध हैं, लेकिन jquery में अतिरिक्त सुविधाओं के रूप में मौजूद हैं। - Nikola Petkanski