type - w3school php




كيف تقوم بتحليل ومعالجة HTML/XML في PHP؟ (19)

ملحقات 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 تم تغطيته بشكل مكثف على StackOverflow ، لذلك إذا اخترت استخدامه ، يمكنك التأكد من أن معظم المشاكل التي تواجهها يمكن حلها من خلال البحث / التصفح Stack Overflow.

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 / XML واستخراج المعلومات منه؟


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

simplehtmldom.sourceforge

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

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


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

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


أوصي PHP Simple HTML Parser .

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

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

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



لقد أنشأت مكتبة باسم PHPPowertools/DOM-Query ، والتي تتيح لك الزحف إلى مستندات HTML5 و XML تمامًا كما تفعل مع jQuery.

تحت الغطاء ، يستخدم symfony / DomCrawler لتحويل محددات CSS إلى محددات 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>');

[...]

الأساليب المدعومة:

  1. إعادة تسمية "اختيار" ، لأسباب واضحة
  2. تمت إعادة تسمية "void" ، حيث أن كلمة "empty" هي كلمة محجوزة في PHP

ملحوظة :

تتضمن المكتبة أيضاً autoloader صفر التكوين الخاص به للمكتبات PSR-0 المتوافقة. يجب أن يعمل المثال المضمن خارج المربع دون أي تكوين إضافي. بدلا من ذلك ، يمكنك استخدامه مع الملحن.


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

لقد كتبت محلل XML للأغراض العامة يمكنه التعامل مع ملفات GB بسهولة. يعتمد على XMLReader وهو سهل الاستخدام:

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

وإليك ريبو جيثوب: XmlExtractor


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


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

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

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


هذا هو يشار إليه عادة باسم كشط الشاشة ، بالمناسبة. المكتبة التي استعملتها لهذا هي Simple HTML Dom Parser .


هناك العديد من الطرق لمعالجة 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 وكيفية استخدامه.


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


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


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


XML_HTMLSax ثابت إلى حد ما - حتى إذا لم يتم الحفاظ عليه أكثر من ذلك. قد يكون هناك خيار آخر وهو توجيهك إلى HTML من خلال Html Tidy ثم تحليلها باستخدام أدوات XML القياسية.


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

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


لماذا لا يجب عليك ومتى يجب عليك استخدام التعبيرات العادية؟

أولاً ، هناك تسمية خاطئة شائعة: Regexps ليست لـ HTML " تحليل " . ومع ذلك ، يمكن للتعبيرات " استخراج " البيانات. الاستخراج هو ما صنعت له. العيب الرئيسي لاستخلاص HTML المعتاد عبر مجموعة أدوات SGML أو محللي XML الأساسيين هو جهدهم النحوي وموثوقية مختلفة.

ضع في اعتبارك أن إنشاء regex لاستخراج HTML يمكن الاعتماد عليه إلى حد ما:

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

هناك حالات استخدام محددة حيث يمكن أن تساعد.

  • لا تكشف العديد من الواجهات الأمامية اجتياز تعليقات HTML <!-- ، والتي على الرغم من أنها أحيانًا ما تكون نقاط ارتداد مفيدة للإستخراج. على وجه الخصوص ، من المتعذر ترويض أشكال pseudo-HTML <$var> أو وحدات بنائية SGML باستخدام regexps.
  • في كثير من الأحيان التعبيرات العادية يمكن أن ينقذ ما بعد المعالجة. ومع ذلك ، فغالبًا ما تحتاج كيانات HTML إلى خدمات يدوية يدوية.
  • وأخيرا ، لمهام بسيطة مثل استخراج <img src = urls ، فهي في الواقع أداة محتملة. ميزة السرعة عبر موزعي SGML / XML تأتي في الغالب لمجرد القيام بهذه الإجراءات الاستخراجية الأساسية.

من المستحسن أحيانًا استخراج مقتطف من HTML مسبقًا باستخدام التعبيرات العادية /<!--CONTENT-->(.+?)<!--END-->/ ومعالجة الباقي باستخدام واجهة محلل HTML الأكثر بساطة.

ملاحظة: لدي هذا app بالفعل ، حيث أستخدم تحليل XML والتعبيرات العادية بدلاً من ذلك. في الأسبوع الماضي ، تم تحليل تحليل PyQuery ، وما زال التعبير المعتاد يعمل. نعم غريب ، ولا يمكنني شرح ذلك بنفسي. لكن هكذا حدث.
لذا يرجى عدم التصويت لاعتبارات الواقع في العالم الحقيقي ، لمجرد أنها لا تتطابق مع regex = mem meme. ولكن دعونا لا نصوت على هذا أكثر من اللازم. انها مجرد sidenote لهذا الموضوع.







html-parsing