سؤال

أحاول جلب بعض HTML من مدونات مختلفة ولاحظت أن موفري الخدمات المختلفين يستخدمون نفس العلامة بطرق مختلفة.

على سبيل المثال، يوجد موفران رئيسيان يستخدمان علامة منشئ الاسم التعريفي بشكل مختلف:

  • مدَّوِن: <meta content='blogger' name='generator'/> (المحتوى أولاً، الاسم لاحقًا، ونعم، علامات الاقتباس المفردة!)
  • وورد: <meta name="generator" content="WordPress.com" /> (الاسم أولا، المحتوى لاحقا)

هل هناك طريقة لاستخراج قيمة المحتوى لجميع الحالات (علامات الاقتباس المفردة/المزدوجة، الأولى/الأخيرة في الصف)؟

ملاحظة.على الرغم من أنني أستخدم Java، فمن المحتمل أن تساعد الإجابة المزيد من الأشخاص إذا كانت مخصصة للتعبيرات العادية بشكل عام.

هل كانت مفيدة؟

المحلول

الجواب هو: لا تستخدم التعبيرات العادية.

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

نصائح أخرى

في الواقع، ربما ينبغي عليك استخدام نوع ما من محلل HTML حيث يمكنك فحص كل عقدة (وبالتالي سمات العقدة) في DOM الخاص بالصفحة.لم أستخدم أيًا من هذه الأشياء منذ فترة، لذلك لا أعرف إيجابياتها وسلبياتها ولكن إليك القائمة http://java-source.net/open-source/html-parsers

هذه الاختلافات ليست مهمة حقًا وفقًا لمعيار XHTML.

وبعبارة أخرى، فهي نفس الشيء تماما.

أيضًا، إذا قمت باستبدال علامات الاقتباس المزدوجة بعلامات اقتباس مفردة، فسيكون الأمر نفسه.

الطريقة النموذجية "لتطبيع" مستند xml هي تقسيمه باستخدام بعض واجهات برمجة التطبيقات (API) التي تتعامل مع المستند على أنه تمثيل لمجموعة المعلومات الخاصة به.تعمل واجهات برمجة التطبيقات ذات النمط DOM وSAX بهذه الطريقة.

إذا كنت تريد تحليلها يدويًا (أو باستخدام RegEx)، فيجب عليك تكرار كل هذه الأشياء في التعليمات البرمجية الخاصة بك، وفي رأيي، هذا غير عملي.

ملحوظة:علامات الاقتباس المفردة (حتى لا توجد علامات اقتباس، إذا كانت القيمة لا تحتوي على مسافة) صالحة وفقًا لـ مواصفات W3C HTML.يقتبس:

بشكل افتراضي، يتطلب SGML أن يتم تحديد جميع قيم السمات باستخدام علامات الاقتباس المزدوجة (ASCII العشري 34) أو علامات الاقتباس المفردة (ASCII العشري 39)...في بعض الحالات، يمكن للمؤلفين تحديد قيمة إحدى السمات دون أي علامات اقتباس.

ولا تنس أيضًا أنه يمكن عكس ترتيب السمات وأن السمات الأخرى يمكن أن تظهر في العلامة.

قد ترغب في إعطاء Java HTMLEditorKit لقطة.من السهل تجربتها لمعرفة ما إذا كان التحليل يوفر ما تبحث عنه.

حسنًا، نظرًا لأنك تبحث عن لغة محايدة، فيمكنك تجربة REGEX مثل /<meta\s.*content=.*>/ وأخذ النتيجة من ذلك وقم بتحليل القيم المحددة التي تبحث عنها.أنا لست خبيرًا في REGEX بأي حال من الأحوال، لذا ربما تكون هناك طريقة أفضل ولكن في استخدام الأداة في http://www.codehouse.com/webmaster_tools/regex/ لقد قمت بمطابقة كلا السلاسل التي قدمتها.

إذا كان يجب عليك استخدام التعبير العادي، فإليك التعبير العادي للحصول على جزء المحتوى فقط:

content\s*=\s*['"].*?['"]

عائدات

content = "blogger"

و

content='Worpress.com'

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

بمجرد حصولك على ذلك، يمكنك الحصول على كل شيء بين علامتي الاقتباس بالطريقة التي تختارها، سواء كان ذلك تعبيرًا عاديًا آخر (وهو أمر غير أخلاقي في تلك المرحلة) أو مجرد التكرار فوق الأحرف.

إذا كنت تستخدم جافا فقد ترغب في إلقاء نظرة عليها معرف com لهذا التطبيق هو com.tagsoup, ، وهو محلل متوافق مع SAX لـ "[تحليل] HTML كما هو موجود في البرية".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top