parsing font - كيف تقوم بتحليل ومعالجة HTML / XML في PHP؟




family w3school (24)

كيف يمكن تحليل HTML / XML واستخراج المعلومات منه؟


Answers

هناك العديد من الطرق لمعالجة HTML / XML DOM التي تم ذكر معظمها بالفعل. ومن ثم ، لن أقدم أي محاولة لإدراج نفسي.

أريد فقط أن أضيف أنني شخصياً أفضل استخدام ملحق DOM ولماذا:

  • iit يجعل الاستخدام الأمثل لميزة الأداء من رمز C الأساسي
  • انها OO PHP (ويسمح لي أن فئة فرعية عليه)
  • إنه مستوى منخفض إلى حد ما (والذي يسمح لي باستخدامه كأساس غير منتفخ لمزيد من السلوك المتقدم)
  • أنه يوفر الوصول إلى كل جزء من DOM (على سبيل المثال على سبيل المثال SimpleXml ، الذي يتجاهل بعض ميزات XML الأقل شهرة)
  • يحتوي على بناء جملة يُستخدم لـ زحف DOM مشابهًا للبناء المستخدم في جافا سكريبت الأصلي.

وبينما أفتقد القدرة على استخدام محددات CSS لـ DOMDocument ، هناك طريقة بسيطة وملائمة لإضافة هذه الميزة: subclassing the DOMDocument وإضافة querySelectorAll JS-like querySelectorAll و querySelector إلى الفئة الفرعية الخاصة بك.

من أجل تحليل المحددات ، فإنني أوصي باستخدام مكون CssSelector البسيط للغاية من إطار Symfony . يقوم هذا المكون فقط بترجمة محددات CSS إلى محددات XPath ، والتي يمكن بعد ذلك إدخالها في DOMXpath لاسترداد Nodelist المقابل.

يمكنك بعد ذلك استخدام هذا المستوى الفرعي (المستوى المنخفض جدا) كأساس لمزيد من الطبقات عالية المستوى ، على سبيل المثال. تحليل أنواع محددة للغاية من XML أو إضافة المزيد من السلوك شبيه jQuery.

يأتي الرمز أدناه مباشرة إلى PHPPowertools/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);
                }
            }
        }
    }

    [...]
}

راجع أيضًا تحليل مستندات XML مع محددات CSS بواسطة مؤسس Symfony Fabien Potencier على قراره بإنشاء مكون CssSelector لـ Symfony وكيفية استخدامه.


Advanced Html Dom عبارة عن استبدال بسيط لـ HTML DOM يقدم نفس الواجهة ، ولكنه مستند إلى DOM مما يعني عدم حدوث أي من مشكلات الذاكرة المقترنة.

كما أن لديها دعم CSS الكامل ، بما في ذلك ملحقات jQuery .


لقد أنشأت مكتبة باسم 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;

يمكنك محاولة استخدام شيء مثل HTML Tidy لتنظيف أي HTML "مكسور" وتحويل HTML إلى XHTML ، والذي يمكنك بعد ذلك تحليله باستخدام محلل XML.


بالنسبة إلى HTML5 ، تم التخلي عن libml5 lib لسنوات حتى الآن. مكتبة HTML5 الوحيدة التي يمكنني العثور عليها مع سجلات التحديث والصيانة الحديثة هي html5-php التي تم جلبها للتو إلى الإصدار بيتا 1.0 قبل أكثر من أسبوع بقليل.


مع FluidXML يمكنك الاستعلام وتكرار XML باستخدام XPath و CSS Selectors .

$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


هناك خيار آخر يمكنك تجربته هو QueryPath . مستوحى من jQuery ، ولكن على الخادم في PHP ويستخدم في Drupal .


هذا يبدو وكأنه وصف مهمة جيدة لتقنية W3C XPath . من السهل التعبير عن الاستعلامات مثل "إرجاع جميع سمات href في علامات img المتداخلة في عناصر <foo><bar><baz> elements ." إذا لم تكن برتقاليًّا PHP ، فلا يمكنني إخبارك بأي شكل قد يكون XPath متاحًا. إذا تمكنت من الاتصال ببرنامج خارجي لمعالجة ملف HTML ، فيمكنك استخدام إصدار سطر أوامر XPath. للحصول على مقدمة سريعة ، راجع XPath .


JSON وصفيف من XML في ثلاثة أسطر:

$xml = simplexml_load_string($xml_string);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

تا دا!


ملحقات XML الأصلية

أفضل استخدام أحد امتدادات XML الأصلية حيث أنها تأتي مع PHP ، وعادة ما تكون أسرع من جميع الـ 3rd party libs وتعطيني كل السيطرة التي أحتاجها فوق الترميز.

DOM

يتيح لك الامتداد DOM العمل على مستندات XML من خلال واجهة برمجة التطبيقات الخاصة بـ DOM مع PHP 5. وهو عبارة عن تطبيق لمعيار W3C's Document Object Model Core Level 3 ، وهو واجهة محاطة باللغات والمنصة تسمح للبرامج والنصوص بالوصول والتحديث بشكل ديناميكي محتوى وهيكل ونمط المستندات.

DOM قادرة على تحليل وتعديل العالم الحقيقي (مكسورة) HTML ويمكن أن تفعل استفسارات XPath . ويستند على libxml .

يستغرق الأمر بعض الوقت للحصول على الإنتاجية باستخدام DOM ، ولكن هذا الوقت يستحق ذلك جيدًا. بما أن DOM هي واجهة ملزمة للغة ، فستجد تطبيقات بالعديد من اللغات ، لذلك إذا كنت بحاجة إلى تغيير لغة البرمجة الخاصة بك ، فستكون بذلك تعرف بالفعل كيفية استخدام واجهة برمجة تطبيقات DOM الخاصة بتلك اللغة.

يمكن العثور على مثال الاستخدام الأساسي في Grabbing the href attribute لعنصر A ويمكن العثور على نظرة عامة عامة على النظرية DOMDocument in php

كيفية استخدام امتداد DOM تم تغطيته بشكل مكثف على ، لذلك إذا اخترت استخدامه ، يمكنك التأكد من أن معظم المشاكل التي تواجهها يمكن حلها من خلال البحث / التصفح .

XMLReader

ملحق XMLReader هو محلل سحب XML. يعمل القارئ كمؤشر للأمام على تدفق المستند ويتوقف عند كل عقدة على الطريق.

يعتمد XMLReader ، مثل DOM ، على libxml. لست على دراية بكيفية تشغيل الوحدة النمطية لـ HTML Parser ، لذلك فإن فرص استخدام XMLReader في تحليل HTML المعطَّل قد تكون أقل قوة من استخدام DOM حيث يمكنك إخبارها صراحةً باستخدام وحدة HTML Parser Module الخاصة بـ libxml.

يمكن العثور على مثال الاستخدام الأساسي في الحصول على جميع القيم من علامات h1 باستخدام php

محلل XML

تمكنك هذه الإضافة من إنشاء موزعي XML ثم تعريف معالجات أحداث XML مختلفة. يحتوي كل محلل XML أيضًا على بعض المعلمات التي يمكنك ضبطها.

تعتمد مكتبة XML Parser أيضًا على libxml ، وتطبق محلل دفع XML طراز SAX . قد يكون خيارًا أفضل لإدارة الذاكرة من DOM أو SimpleXML ، ولكن سيكون من الصعب العمل معه أكثر من محلل السحب الذي تم تنفيذه بواسطة XMLReader.

SimpleXml

يوفر ملحق SimpleXML مجموعة أدوات بسيطة للغاية وسهلة الاستخدام لتحويل XML إلى كائن يمكن معالجته باستخدام محددات الخصائص العادية ومكررات الصفيف.

يعد SimpleXML خيارًا عندما تعرف أن HTML صالح XHTML. إذا كنت بحاجة إلى تحليل HTML المعطلة ، فلا تفكر حتى في SimpleXml لأنها ستختنق.

يمكن العثور على مثال الاستخدام الأساسي في برنامج بسيط لعقدة CRUD وقيم عقدة ملف xml وهناك الكثير من الأمثلة الإضافية في دليل PHP .

مكتبات الجهات الخارجية (libxml)

إذا كنت تفضل استخدام lib لجهة خارجية ، فأقترح استخدام lib الذي يستخدم DOM / libxml أسفل بدلاً من تحليل السلسلة.

FluentDom

يوفر FluentDOM واجهة XML تشبه jQuery jQuery لـ DOMDocument في PHP. يتم كتابة المحددات في XPath أو CSS (باستخدام CSS لتحويل XPath). تقوم الإصدارات الحالية بتوسيع DOM الذي يعمل على واجهات قياسية وإضافة ميزات من DOM Living Standard. يمكن FluentDOM تحميل تنسيقات مثل JSON و CSV و JsonML و RabbitFish وغيرها. يمكن تثبيتها عبر الملحن.

HtmlPageDom

Wa72 \ HtmlPageDom 'مكتبة PHP لمعالجة سهلة لمستندات HTML باستخدام It يتطلب DomCrawler من مكونات Symfony2 لعبور شجرة DOM وتمديده بإضافة طرق لمعالجة شجرة DOM لمستندات HTML.

phpQuery (لم يتم تحديثه لسنوات)

phpQuery عبارة عن واجهة برمجة تطبيقات (Object Model Model Model (DOM)) من جانب الخادم ، قابلة للتسلسل ، تستند إلى CSS ، وهي مبنية على مكتبة جافا سكريبت jQuery المكتوبة بـ PHP5 وتوفر واجهة سطر الأوامر الإضافية (CLI).

انظر أيضا: https://github.com/electrolinux/phpquery

Zend_Dom

يوفر Zend_Dom أدوات للعمل مع مستندات DOM والهياكل. نقدم حاليًا Zend_Dom_Query ، الذي يوفر واجهة موحدة للاستعلام عن مستندات DOM باستخدام كل من محددات XPath و CSS.

QueryPath

QueryPath هي مكتبة PHP لمعالجة XML و HTML. وهي مصممة للعمل ليس فقط مع الملفات المحلية ، ولكن أيضا مع خدمات الويب وموارد قواعد البيانات. وهو يستخدم الكثير من واجهة jQuery (بما في ذلك محددات نمط CSS) ، ولكنه يتم ضبطه بشكل كبير للاستخدام من جانب الخادم. يمكن تثبيتها عبر الملحن.

fDOMDocument

يوسع fDOMDocument معيار DOM لاستخدام الاستثناءات في جميع حالات الأخطاء بدلاً من تحذيرات أو إشعارات PHP. كما أنها تضيف أساليب واختصارات مخصصة مختلفة للملاءمة وتبسيط استخدام DOM.

sabre/xml

saber / xml هي مكتبة تلتف ويمتد فئتا XMLReader و XMLWriter لإنشاء نظام تخطيط بسيط "xml to object / array" ونمط التصميم. كتابة وقراءة XML هو تمرير مفرد ، وبالتالي يمكن أن تكون سريعة وتتطلب ذاكرة منخفضة على ملفات xml كبيرة.

FluidXML

FluidXML هي مكتبة PHP للتلاعب بـ XML مع واجهة برمجة تطبيقات موجزة وبطلاقة. إنه يعزز XPath ونمط البرمجة بطلاقة لتكون ممتعة وفعالة.

طرف ثالث (غير معتمد على الليبكس)

إن الفائدة من البناء على DOM / libxml هي أن تحصل على أداء جيد من الصندوق لأنك تعتمد على امتداد أصلي. ومع ذلك ، لا تسقط جميع أشكال الطرف الثالث هذه الطريق. بعض منهم المذكورة أدناه

فب HTML بسيط محلل DOM

  • يتيح لك محلل DOM HTML المكتوب بلغة PHP5 + التعامل مع HTML بطريقة سهلة للغاية!
  • يتطلب PHP 5+.
  • يدعم HTML غير صالح.
  • ابحث عن العلامات في صفحة HTML مع محددات مثل jQuery.
  • استخراج محتويات من HTML في سطر واحد.

أنا عموما لا أوصي بهذا المحلل اللغوي. قاعدة البيانات الرهيبة والمحلل نفسه بطيء إلى حد ما والذاكرة من الجوع. لا يمكن تحديد جميع مختارات jQuery (مثل محددات الأطفال ). أي من المكتبات القائمة على libxml يجب أن تتفوق على هذا بسهولة.

PHP Html محلل

PHPHtmlParser هو محلل HTML بسيط ومرنة ، والذي يسمح لك بتحديد العلامات باستخدام أي محدد css ، مثل jQuery. الهدف هو المساعدة في تطوير الأدوات التي تتطلب طريقة سريعة وسهلة لإلغاء html ، سواء كانت صحيحة أم لا! كان هذا المشروع أصليًا بدعم من sunra / php-simple-html-dom-parser ، لكن يبدو أن الدعم توقف ، لذا فإن هذا المشروع هو تكيفي لعمله السابق.

مرة أخرى ، لا أوصي بهذا المحلل اللغوي. وهو بطيء إلى حد ما مع استخدام وحدة المعالجة المركزية عالية. لا توجد أيضًا أي وظيفة لمسح ذاكرة كائنات DOM التي تم إنشاؤها. هذه المشاكل نطاق ولا سيما مع حلقات متداخلة. الوثائق نفسها غير دقيقة وأخطاء إملائية ، مع عدم وجود ردود على الإصلاحات منذ 14 أبريل 16.

Ganon

  • رمز مميز عالمي ومحلل HTML HTML / XML / RSS DOM
    • القدرة على التعامل مع العناصر وسماتها
    • يدعم HTML غير صالح و UTF8
  • يمكن تنفيذ استعلامات تشبه CSS3 متقدمة على عناصر (مثل مسج - مساحات الأسماء المدعومة)
  • أتش تي أم أل beautifier (مثل HTML أنيق)
    • تصغير CSS وجافا سكريبت
    • فرز السمات وتغيير حالة الأحرف والمسافة البادئة الصحيحة وما إلى ذلك
  • توسع
    • تحليل المستندات باستخدام عمليات رد الاتصال استنادًا إلى الحرف / الرمز الحالي
    • عمليات فصلها في وظائف أصغر لسهولة overriding
  • بسرعة وسهولة

لم تستخدمها ابدا. لا يمكن معرفة ما إذا كان أي شيء جيد.

HTML 5

يمكنك استخدام ما سبق لتحليل HTML5 ، ولكن يمكن أن يكون هناك بعض التراجعات بسبب الترميز HTML5 الذي يسمح به. لذا ، بالنسبة إلى HTML5 ، يتعين عليك التفكير في استخدام محلل مخصص ، مثل

html5lib

تطبيقات Python و PHP لمحلل HTML استنادًا إلى مواصفات WHATWG HTML5 للحصول على أقصى توافق مع متصفحات الويب المكتبية الرئيسية.

قد نرى مزيدًا من المحللون المخصصون بعد الانتهاء من HTML5. هناك أيضًا مدونة عن طريق W3 بعنوان " How-To for html 5 parsing" تستحق التدقيق.

خدمات الويب

إذا كنت لا ترغب في برمجة PHP ، فيمكنك أيضًا استخدام خدمات الويب. بشكل عام ، وجدت فائدة قليلة جدا لهذه ، ولكن هذا أنا وحالات الاستخدام الخاصة بي.

YQL

تمكّن خدمة ويب YQL التطبيقات من الاستعلام والتصفية ودمج البيانات من مصادر مختلفة عبر الإنترنت. تحتوي عبارات YQL على بنية تشبه SQL ، مألوفة لأي مطور لديها خبرة في قاعدة البيانات.

ScraperWiki .

تتيح لك الواجهة الخارجية لـ ScraperWiki استخراج البيانات بالشكل الذي تريد استخدامه على الويب أو في تطبيقاتك الخاصة. يمكنك أيضًا استخراج معلومات حول حالة أي مكشطة.

التعبيرات العادية

وأخيرًا وأقل توصية ، يمكنك استخراج البيانات من HTML مع التعبيرات العادية . بصفة عامة ، لا يتم تشجيع استخدام التعبيرات العادية على HTML.

تكون معظم المقتطفات التي ستجدها على الويب لتتوافق مع العلامات هشة. في معظم الحالات ، يعملون فقط على جزء HTML خاص جدًا. يمكن أن تؤدي تغييرات العلامات الصغيرة ، مثل إضافة مسافة بيضاء في مكان ما ، أو إضافة ، أو تغيير السمات في علامة ، إلى فشل RegEx عند عدم كتابتها بشكل صحيح. يجب عليك معرفة ما تقوم به قبل استخدام RegEx على HTML.

يعرف موزعي HTML بالفعل القواعد النحوية لـ HTML. يجب أن يتم تعليم التعبيرات العادية لكل نظام RegEx جديد تكتبه. RegEx على ما يرام في بعض الحالات ، لكنها تعتمد حقا على حالة الاستخدام الخاصة بك.

يمكنك كتابة موزعات أكثر موثوقية ، ولكن كتابة محلل مخصص كامل وموثوق به مع التعبيرات العادية هو مضيعة للوقت عندما تكون المكتبات المذكورة أعلاه موجودة بالفعل وتقوم بعمل أفضل بكثير في هذا الشأن.

راجع أيضًا Parsing Html The Cthulhu Way

كتب

إذا كنت ترغب في إنفاق بعض المال ، إلقاء نظرة على

أنا لست من المنتسبين إلى PHP Architect أو المؤلفين.


HTML DOM بسيط هو محلل كبير مفتوح المصدر:

simplehtmldom.sourceforge

يتعامل مع عناصر DOM بطريقة موجهة للكائنات ، والتكرار الجديد يحتوي على تغطية كبيرة للشفرة غير المتوافقة. هناك أيضًا بعض الوظائف الرائعة مثل التي تراها في جافا سكريبت ، مثل الدالة "find" ، والتي ستعرض جميع أمثلة عناصر اسم العلامة هذا.

لقد استخدمت هذا في عدد من الأدوات ، واختبرته على العديد من أنواع صفحات الويب المختلفة ، وأعتقد أنه يعمل بشكل رائع.


أوصي PHP Simple HTML Parser .

انها حقا ميزات جميلة ، مثل:

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

أحد الأساليب العامة التي لم أشاهدها هنا هي تشغيل HTML من خلال Tidy ، والتي يمكن ضبطها لتبصّر XHTML الصالحة المضمونة. ثم يمكنك استخدام أي مكتبة XML قديمة عليها.

ولكن بالنسبة لمشكلتك المحددة ، يجب عليك إلقاء نظرة على هذا المشروع: http://fivefilters.org/content-only/ - إنه نسخة معدلة من خوارزمية Readability ، والتي تم تصميمها لاستخلاص المحتوى النصي فقط (وليس العناوين والتذييلات) من الصفحة.


بالنسبة إلى 1 أ و 2: سأصوت لفئة سيمفوني Componet الجديدة DOMCrawler ( DomCrawler ). تسمح هذه الفئة باستعلامات مشابهة لمختارات CSS. ألق نظرة على هذا العرض التقديمي لأمثلة من العالم الحقيقي: news-of-the-symfony2-world .

تم تصميم المكون للعمل بشكل مستقل ويمكن استخدامه بدون Symfony.

العيب الوحيد هو أنها ستعمل فقط مع PHP 5.3 أو الأحدث.


يحتوي إطار Symfony على حزم يمكنها تحليل HTML ، ويمكنك استخدام نمط CSS لتحديد DOM بدلاً من استخدام XPath .



QueryPath جيد ، ولكن كن حذرًا من سبب "تتبع الحالة" إذا لم تدرك معنى ذلك ، فقد يعني ذلك أنك تهدر الكثير من وقت التصحيح في محاولة لمعرفة ما حدث ولماذا لا يعمل الرمز.

ما يعنيه ذلك هو أن كل مكالمة على مجموعة النتائج تعدل مجموعة النتائج في الكائن ، وهي غير قابلة للتسلسل كما هو الحال في jquery حيث يكون كل رابط مجموعة جديدة ، ولديك مجموعة واحدة هي نتائج استفسارك وكل تعديل لوظيفة يتم تعديله هذا مجموعة واحدة.

من أجل الحصول على سلوك يشبه jquery ، تحتاج إلى التفرع قبل إجراء تصفية / تعديل مثل العملية ، وهذا يعني أنها سوف تعكس ما يحدث في jquery عن كثب أكثر من ذلك بكثير.

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

تحتوي $results الآن على مجموعة النتائج input[name='forename'] وليس الاستعلام الأصلي "div p" هذا يعثرني كثيرًا ، ما وجدته هو أن QueryPath يتتبع الفلاتر ويجد وكل ما يعدل نتائجك ومخازنك لهم في الكائن. تحتاج إلى القيام بذلك بدلا من ذلك

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

ثم لن يتم تعديل $results ويمكنك إعادة استخدام مجموعة النتائج مرارا وتكرارا ، وربما يمكن لشخص ما لديه معرفة أكثر أن يزيل هذا قليلا ، لكنه في الأساس مثل هذا مما وجدته.


phpQuery و QueryPath في تكرار واجهة برمجة تطبيقات jQuery التي تتسم بطلاقة. وهذا هو السبب أيضًا في أنهما من أسهل المقاربات لتحليل HTML بشكل صحيح في PHP.

أمثلة ل QueryPath

بشكل أساسي ، عليك أولاً إنشاء شجرة DOM قابلة للاستعلام من سلسلة HTML:

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

يحتوي الكائن الناتج على تمثيل شجرة كامل لمستند HTML. يمكن عبوره باستخدام طرق DOM. لكن النهج المشترك هو استخدام محددات CSS في jQuery:

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

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

في الغالب تريد استخدام محددات tag #id و .class أو DIV البسيطة لـ ->find() . ولكن يمكنك أيضًا استخدام عبارات XPath ، والتي تكون أحيانًا أسرع. كما أن أساليب jQuery النموذجية مثل ->children() و ->text() وبالأخص ->attr() تبسط عملية استخراج مقتطفات HTML الصحيحة. (ولديك بالفعل فك رموز SGML الخاصة بهم.)

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

QueryPath يسمح أيضًا بوضع علامات جديدة في الدفق ( ->append ) ، والإخراج لاحقًا ->writeHTML وثيقة محدثة ( ->writeHTML ). لا يمكن تحليل HTML غير صحيح فحسب ، بل أيضًا لهجات XML مختلفة (مع مساحات الأسماء) ، وحتى استخراج البيانات من تنسيقات microformat HTML (XFN ، vCard).

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

.

phpQuery أو QueryPath؟

عموما QueryPath هو أكثر ملاءمة للتلاعب في الوثائق. بينما يقوم phpQuery أيضًا بتنفيذ بعض الأساليب AJAX الزائفة (طلبات HTTP فقط) لتشبه jQuery أكثر. يقال أن phpQuery غالباً ما يكون أسرع من QueryPath (بسبب عدد أقل من الخصائص العامة).

لمزيد من المعلومات عن الاختلافات ، انظر هذه المقارنة على جهاز التراجع من tagbyte.org . (تم فقد المصدر الأصلي ، لذا إليك رابط أرشيف الإنترنت. نعم ، لا يزال بإمكانك العثور على الصفحات المفقودة أو الأشخاص.)

وهنا مقدمة شاملة عن QueryPath .

مزايا

  • البساطة والموثوقية
  • بسيطة لاستخدام البدائل ->find("a img, a object, div a")
  • تفريغ البيانات بطريقة صحيحة (بالمقارنة مع التزاوج المعتاد للتعبير)

جرب HTML DOM محلل بسيط

  • محلل HTML HTML مكتوب بلغة PHP 5+ يتيح لك التعامل مع HTML بطريقة سهلة للغاية!
  • يتطلب PHP 5+.
  • يدعم HTML غير صالح.
  • ابحث عن العلامات في صفحة HTML مع محددات مثل jQuery.
  • استخراج محتويات من HTML في سطر واحد.
  • Download


أمثلة:

كيفية الحصول على عناصر 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;


استخراج محتوى من 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() مع ذلك. خوارزمية تحليل HTML لـ libxml جيدة جدًا وسريعة ، وعلى عكس الاعتقاد الشائع ، لا يخنق HTML غير صحيح.


نعم ، يمكنك استخدام simple_html_dom لهذا الغرض. ومع ذلك ، فقد عملت كثيرًا مع simple_html_dom ، لا سيما لتخريد الويب ، ووجدناها ضعيفة للغاية. يقوم بالمهمة الأساسية ولكن لن أوصي به على أي حال.

لم أستخدم أبدًا لهذا الغرض ولكن ما تعلمته هو أن الضفيرة تستطيع القيام بالمهمة بشكل أكثر كفاءة وأكثر صلابة.

يرجى الاطلاع على هذا الرابط: scraping-websites-with-curl


لقد أنشأنا عددًا قليلاً من برامج الزحف لاحتياجاتنا من قبل. في نهاية اليوم ، عادة ما تكون التعبيرات العادية البسيطة هي التي تفعل الشيء الأفضل. في حين أن المكتبات المذكورة أعلاه جيدة للسبب الذي تم إنشاؤها به ، إذا كنت تعرف ما تبحث عنه ، فإن التعبيرات العادية هي طريقة أكثر أمانًا ، حيث يمكنك التعامل مع هياكل HTML / XHTML غير صالحة ، والتي قد تفشل ، إذا تم تحميلها عبر معظم المحللين.


هناك عدة أسباب لعدم تحليل 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/")));

يبدو السؤال قديمًا بعض الشيء. ولكن اسمحوا لي أن أقترح وظيفة ، parseStr ، مما يجعل شيئا مشابها ، وهذا هو ، إرجاع عدد صحيح أو طفو وإذا كان لا يمكن تحويل سلسلة ASCII معينة إلى أي منها ، فإنه يعيدها دون مساس. قد يتم تعديل الكود بالطبع للقيام بما تريد فقط:

   >>> import string
   >>> parseStr = lambda x: x.isalpha() and x or x.isdigit() and \
   ...                      int(x) or x.isalnum() and x or \
   ...                      len(set(string.punctuation).intersection(x)) == 1 and \
   ...                      x.count('.') == 1 and float(x) or x
   >>> parseStr('123')
   123
   >>> parseStr('123.3')
   123.3
   >>> parseStr('3HC1')
   '3HC1'
   >>> parseStr('12.e5')
   1200000.0
   >>> parseStr('12$5')
   '12$5'
   >>> parseStr('12.2.2')
   '12.2.2'




php xml parsing xml-parsing html-parsing