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




xml-parsing html-parsing (24)

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

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

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

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


इसे आमतौर पर स्क्रीन स्क्रैपिंग के रूप में जाना जाता है। पुस्तकालय मैंने इसके लिए उपयोग किया है सरल HTML डोम पार्सर है


HTML5 , एचटीएमएल 5 lib अब वर्षों से छोड़ दिया गया है। एकमात्र एचटीएमएल 5 लाइब्रेरी जो मुझे हालिया अपडेट और रखरखाव रिकॉर्ड के साथ मिल सकती है वह html5-php जिसे एक हफ्ते पहले बीटा 1.0 में लाया गया था।


एक अन्य विकल्प जिसे आप कोशिश कर सकते हैं वह QueryPath । यह jQuery द्वारा प्रेरित है, लेकिन PHP में सर्वर पर और Drupal में उपयोग किया जाता है।


हमने पहले हमारी जरूरतों के लिए कुछ क्रॉलर बनाए हैं। दिन के अंत में, आमतौर पर यह सामान्य नियमित अभिव्यक्ति होती है जो सबसे अच्छी चीज करती है। जबकि ऊपर सूचीबद्ध पुस्तकालय उनके द्वारा बनाए गए कारणों के लिए अच्छे हैं, यदि आप जानते हैं कि आप क्या खोज रहे हैं, तो नियमित अभिव्यक्तियां एक सुरक्षित तरीका है, क्योंकि आप गैर-मान्य HTML / XHTML संरचनाओं को भी संभाल सकते हैं, जो विफल हो जाएंगे, अगर लोड हो जाएंगे अधिकांश पार्सर्स के माध्यम से।


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

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


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

सबसे पहले, एक आम गलत नामक: Regexps " पार्सिंग " HTML के लिए नहीं हैं। 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 पार्सर /<!--CONTENT-->(.+?)<!--END-->/ का उपयोग करके शेष को संसाधित करें।

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


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

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

कृपया इस लिंक को देखें: scraping-websites-with-curl


QueryPath अच्छा है, लेकिन "ट्रैकिंग स्थिति" कारण से सावधान रहें यदि आपको इसका एहसास नहीं हुआ है, तो इसका मतलब यह हो सकता है कि क्या हुआ यह पता लगाने की कोशिश कर रहा है कि कोड क्या नहीं हुआ है और कोड क्यों काम नहीं करता है।

इसका अर्थ यह है कि परिणाम सेट पर प्रत्येक कॉल ऑब्जेक्ट में परिणाम सेट को संशोधित करता है, यह jquery में चेन करने योग्य नहीं है जहां प्रत्येक लिंक एक नया सेट है, आपके पास एक ही सेट है जो आपकी क्वेरी से परिणाम है और प्रत्येक फ़ंक्शन कॉल संशोधित करता है वह एकल सेट

jquery-like व्यवहार प्राप्त करने के लिए, आपको ऑपरेशन की तरह फ़िल्टर / संशोधित करने से पहले शाखा की आवश्यकता होती है, जिसका अर्थ है कि यह 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 संशोधित नहीं किए जाएंगे और आप बार-बार परिणाम सेट का पुन: उपयोग कर सकते हैं, शायद अधिक ज्ञान वाले किसी को यह थोड़ा सा साफ़ कर सकता है, लेकिन मूल रूप से यह मुझे मिला है जो मुझे मिला है।


उन्नत एचटीएमएल डोम एक साधारण एचटीएमएल DOM प्रतिस्थापन है जो एक ही इंटरफ़ेस प्रदान करता है, लेकिन यह डोम-आधारित है जिसका अर्थ है कि संबंधित स्मृति समस्याओं में से कोई भी नहीं होता है।

इसमें jQuery एक्सटेंशन सहित पूर्ण सीएसएस समर्थन भी है।


आप किसी भी "टूटी हुई" एचटीएमएल को साफ करने और एचटीएमएल को एक्सएचटीएमएल में बदलने के लिए एचटीएमएल टिडी जैसे कुछ का उपयोग करने का प्रयास कर सकते हैं, जिसे आप एक्सएमएल पार्सर के साथ पार्स कर सकते हैं।


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

simplehtmldom.sourceforge

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

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


Symfony ढांचे में बंडल हैं जो HTML को पार्स कर सकते हैं, और आप XPath का उपयोग करने के बजाय DOM का चयन करने के लिए सीएसएस शैली का उपयोग XPath


नियमित अभिव्यक्ति से 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/")));

HTML / XML DOM को संसाधित करने के कई तरीके हैं जिनमें से अधिकांश का पहले ही उल्लेख किया जा चुका है। इसलिए, मैं खुद को सूचीबद्ध करने का कोई प्रयास नहीं करूंगा।

मैं केवल यह जोड़ना चाहता हूं कि मैं व्यक्तिगत रूप से डीओएम एक्सटेंशन का उपयोग करना पसंद करता हूं और क्यों:

  • iit अंतर्निहित सी कोड के प्रदर्शन लाभ का इष्टतम उपयोग करता है
  • यह ओओ PHP है (और मुझे इसे उपclass करने की अनुमति देता है)
  • यह अपेक्षाकृत कम स्तर है (जो मुझे इसे अधिक उन्नत व्यवहार के लिए गैर-ब्लोटेड नींव के रूप में उपयोग करने की अनुमति देता है)
  • यह डीओएम के हर हिस्से तक पहुंच प्रदान करता है (उदाहरण के विपरीत। SimpleXml, जो कम ज्ञात एक्सएमएल सुविधाओं में से कुछ को अनदेखा करता है)
  • इसमें डीओएम क्रॉलिंग के लिए इस्तेमाल किया गया एक वाक्यविन्यास है जो मूल जावास्क्रिप्ट में उपयोग किए गए वाक्यविन्यास के समान है।

और जब मैं DOMDocument लिए सीएसएस चयनकर्ताओं का उपयोग करने की क्षमता को याद करता हूं, तो इस सुविधा को जोड़ने का एक आसान और सुविधाजनक तरीका है: DOMDocument उप querySelectorAll और JS-like querySelectorAll और querySelector आपके उप querySelector विधियां querySelector

चयनकर्ताओं को पार्स करने के लिए, मैं सिम्फनी ढांचे से बहुत कम से कम CssSelector घटक का उपयोग करने की सलाह देता हूं। यह घटक सिर्फ सीएसएस चयनकर्ताओं को XPath चयनकर्ताओं में अनुवाद करता है, जिन्हें संबंधित नोडेलिस्ट को पुनः प्राप्त करने के लिए किसी DOMXpath में खिलाया जा सकता है।

इसके बाद आप इस (अभी भी बहुत कम स्तर) उपclass का उपयोग उच्च स्तर के वर्गों के लिए आधार के रूप में कर सकते हैं, उदाहरण के लिए। एक्सएमएल के बहुत विशिष्ट प्रकारों को पार्स करें या अधिक 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 के निर्माता C FabSelector घटक को सिम्फनी के लिए CssSelector घटक बनाने और इसका उपयोग करने के निर्णय पर सीएसएस चयनकर्ताओं के साथ सीएसएस चयनकर्ताओं के साथ पार्सिंग एक्सएमएल दस्तावेज भी देखें।


SimpleHtmlDom के तृतीय पक्ष विकल्प जो स्ट्रिंग पार्सिंग के बजाय DOM का उपयोग करते हैं: phpQuery , Zend_Dom , QueryPath और FluentDom



मैंने PHPPowertools/DOM-Query नामक एक लाइब्रेरी बनाई है, जो आपको jQuery और XML दस्तावेज़ों को क्रॉल करने की अनुमति देता है जैसे आप jQuery के साथ करते हैं।

हुड के तहत, यह सीपी चयनकर्ताओं को 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. नामित 'शून्य', क्योंकि 'खाली' PHP में एक आरक्षित शब्द है

ध्यान दें :

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


FluidXML साथ आप FluidXML और सीएसएस चयनकर्ताओं का उपयोग कर एक्सएमएल क्वेरी और FluidXML कर सकते हैं।

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

FluidXML


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

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

DOM

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

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

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

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

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

XMLReader

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

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

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

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

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

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

SimpleXml

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

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

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

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

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

FluentDom

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

HtmlPageDom

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

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 चेतावनियों या नोटिस के बजाय त्रुटियों के सभी अवसरों पर अपवादों का उपयोग करने के लिए बढ़ाता है। वे सुविधा के लिए विभिन्न कस्टम तरीकों और शॉर्टकट भी जोड़ते हैं और डीओएम के उपयोग को सरल बनाते हैं।

sabre/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 को पार्स करने के लिए कर सकते हैं, लेकिन मार्कअप एचटीएमएल 5 की अनुमति के कारण क्विर्क हो सकता है । तो एचटीएमएल 5 के लिए आप एक समर्पित पार्सर का उपयोग करने पर विचार करना चाहते हैं, जैसे

html5lib

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

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

वेब सेवाएं

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

YQL

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

ScraperWiki

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

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

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

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

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

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

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

पुस्तकें

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

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


phpQuery और QueryPath धाराप्रवाह jQuery API को दोहराने में बेहद समान हैं। यही कारण है कि वे 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");
 }

अधिकतर आप ->find() लिए सरल #id और .class या DIV टैग चयनकर्ताओं का उपयोग करना चाहते हैं। लेकिन आप XPath कथन का भी उपयोग XPath सकते हैं, जो कभी-कभी तेज़ होते हैं। इसके अलावा सामान्य jQuery विधियों जैसे- ->children() और ->text() और विशेष रूप से ->attr() सही HTML स्निपेट निकालने को सरल बनाते हैं। (और पहले से ही उनके एसजीएमएल इकाइयां डीकोड की गई हैं।)

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

QueryPath भी नए टैग को स्ट्रीम ( ->append ) में इंजेक्शन करने की अनुमति देता है, और बाद में आउटपुट और अद्यतन दस्तावेज़ ( ->writeHTML ) को ->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 की तुलना में)

XML_HTMLSax बल्कि स्थिर है - भले ही इसे और बनाए रखा न जाए। एचटीएमएल टिडी के माध्यम से एचटीएमएल को पाइप करने का एक और विकल्प हो सकता है और फिर इसे मानक एक्सएमएल टूल्स के साथ पार्स कर सकता है।


मैंने 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;

यह मेरे दिमाग को उड़ा दिया कि यह कितना आसान था। आप डिफ़ॉल्ट रूप से org.json पैकेज में JSONObject के निर्माता को अपने JSON को रखने वाली String पास कर सकते हैं।

JSONArray rootOfPage =  new JSONArray(JSONString);

किया हुआ। माइक्रोफोन ड्रॉप यह JSONObjects साथ भी काम करता है। उसके बाद, आप अपनी ऑब्जेक्ट्स पर get() विधियों का उपयोग करके Objects अपने पदानुक्रम को देख सकते हैं।





php xml parsing xml-parsing html-parsing