سؤال

لقد أنقذ كامل صفحة ويب html إلى سلسلة ، والآن أريد أن انتزاع "href" القيم من الروابط ، ويفضل أن يكون ذلك مع القدرة على حفظ لهم سلاسل مختلفة في وقت لاحق.ما هي أفضل طريقة للقيام بذلك ؟

لقد حاولت إنقاذ السلسلة بمثابة .xml doc و تحليل ذلك باستخدام XPathDocument الملاح ، ولكن (المفاجأة) لا تنقل لا حقا-an-xml-الوثيقة جيدا.

هي التعبيرات العادية في أفضل وسيلة لتحقيق ما أحاول تحقيقه ؟

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

المحلول

التعبيرات العادية هي طريقة واحدة للقيام بذلك ، ولكن يمكن أن يكون مشكلة.

معظم صفحات HTML لا يمكن تحليلها باستخدام معيار html تقنيات لأنه كما كنت قد وجدت, لا أكثر صحة.

يمكنك قضاء الوقت في محاولة دمج HTML مرتبة أو أداة مشابهة ، ولكن سيكون أسرع بكثير من مجرد بناء التعابير المنطقية التي تحتاج إليها.

التحديث

في ذلك الوقت من هذا التحديث لقد تلقيت 15 و 9 downvotes.أعتقد أنه ربما الناس لا قراءة السؤال أو تعليقات على هذا الجواب.كل OP كان انتزاع href القيم. هذا هو. من هذا المنظور, بسيطة regex هو على ما يرام.إذا كان المؤلف قد أراد أن تحليل عناصر أخرى ثم لا توجد وسيلة أنصح باستخدام التعابير المنطقية وكما ذكرت في البداية انها مشكلة في أحسن الأحوال.

نصائح أخرى

يمكنني أن أوصي HTML Agility Pack.كنت استخدمه في حالات قليلة حيث كنت بحاجة إلى تحليل HTML ويعمل كبيرة.بمجرد تحميل HTML الخاص بك إلى ذلك ، يمكنك استخدام XPath تعبيرات الاستعلام عن الوثيقة والحصول على مرساة الخاص به (فضلا عن أي شيء آخر هناك).

HtmlDocument yourDoc = // load your HTML;
int someCount = yourDoc.DocumentNode.SelectNodes("your_xpath").Count;

التعامل مع HTML من جميع الأشكال والأحجام أنا أفضل أن استخدام HTMLAgility حزمة @ http://www.codeplex.com/htmlagilitypack فإنه يتيح لك كتابة مسارات xpath ضد العقد تريد الحصول على تلك العودة في مجموعة.

ربما كنت تريد شيئا مثل مهيب محلل: http://www.majestic12.co.uk/projects/html_parser.php

هناك عدد قليل من الخيارات الأخرى التي يمكن أن تتعامل مع قشاري html،.Html Agility Pack يستحق نظرة شخص آخر المذكورة.

لا أعتقد regexes هي الحل الأمثل HTML, HTML منذ ليس الخالية من السياق.ربما أنها سوف تنتج كاف ، إذا كان غير دقيقة نتيجة ؛ حتى deterministically تحديد URI هو فوضوي المشكلة.

فمن الأفضل دائما إن أمكن إلى إعادة اكتشاف العجلة.بعض الأدوات الجيدة موجودة إما تحويل HTML إلى XML أو بمثابة XmlReader:

هنا ثلاث أدوات جيدة:

  1. TagSoup, مفتوح المصدر برنامج جافا و ساكس - بناء أداة وضعتها جون كوان.هذا هو أ ساكس المتوافقة مع محلل مكتوب في جاوة ، بدلا من تحليل بشكل جيد أو صالح XML, يوزع HTML كما انها وجدت في البرية:الفقراء سيئة و وحشية ، على الرغم من كثير من الأحيان بعيدا عن القصير.TagSoup هو مصمم للأشخاص الذين لديهم لمعالجة هذه الأشياء باستخدام بعض مظاهر الرشيد تصميم التطبيق.من خلال توفير ساكس واجهة ، فإنه يسمح معيار XML ليتم تطبيقها حتى أسوأ HTML.TagSoup كما يتضمن سطر الأوامر المعالج أن يقرأ ملفات HTML و يمكن أن تولد إما نظيفة HTML أو XML التي يتم التقريب إلى XHTML.
    متجانسة هو تجاري C++ ميناء TagSoup.

  2. SgmlReader هو أداة تم تطويرها من قبل مايكروسوفت كريس لوفيت.
    SgmlReader هو XmlReader API أكثر من أي SGML الوثيقة (بما في ذلك بنيت في دعم HTML).أداة سطر الأوامر كما يتوفر النواتج وكذلك XML النتيجة.
    تحميل ملف مضغوط بما في ذلك مستقل قابل للتنفيذ و رمز مصدر الكامل: SgmlReader.zip

  3. الإنجاز المتميز هو نقية XSLT 2.0 محلل HTML كتبه ديفيد كارلايل.

قراءة مدونة سيكون كبيرا ممارسة التعلم لكل فرد منا.

من الوصف:

"d:htmlparse(سلسلة)
d:htmlparse(string,مساحة,html-mode)

حجة واحد شكل ما يعادل)
d:htmlparse(string,'http://ww.w3.org/1999/xhtml',true()))

يوزع السلسلة كـ HTML أو XML باستخدام بعض يحمل في ثناياه عوامل الاستدلال على)
السيطرة الضمنية فتح وإغلاق من العناصر.

أنه ليس لديه المعرفة الكاملة DTD HTML ولكن لديها قائمة كاملة من
فارغة عناصر القائمة الكاملة الكيان التعاريف.HTML الكيانات ،
رقم عشري hex حرف المراجع كلها مقبولة.ملاحظة html الكيانات
يتم الاعتراف بها حتى لو html-mode=false().

أسماء العناصر هي lowercased (إذا html-وضع صحيح()) و وضعها في
مساحة محددة من قبل المعلمة مساحة (التي قد تكون "" للدلالة على
لا-مساحة ما لم المدخلات قد explict مساحة الإعلانات ،
الحالة هذه سيتم تكريم.

السمة أسماء lowercased إذا html-mode=true()
"

قراءة وصف أكثر تفصيلا هنا.

نأمل أن يكون هذا ساعد.

الهتافات ،

Dimitre Novatchev.

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

href=[\"\'](http:\/\/|\.\/|\/)?\w+(\.\w+)*(\/\w+(\.\w+)?)*(\/|\?\w*=\w*(&\w*=\w*)*)?[\"\']

من هنا على RegExLib يجب أن تبدأ

قد يكون أكثر حظا باستخدام xml إذا كنت تعرف أو يمكن إصلاح الوثيقة أن تكون على الأقل بشكل جيد.إذا كان لديك جيد html (أو بالأحرى ، xhtml), xml في .صافي ينبغي أن تكون قادرة على التعامل معها.للأسف جيدة html نادرة للغاية.

من ناحية أخرى, التعبيرات العادية هي حقا سيئة في تحليل html.لحسن الحظ, لا تحتاج إلى التعامل مع html كامل المواصفات.كل ما عليك أن تقلق بشأن تحليل href= سلاسل الحصول على عنوان url.حتى هذا يمكن أن تكون صعبة لذلك لن تجعل محاولة في ذلك الحق بعيدا.بدلا من ذلك سوف نبدأ بطرح بعض الأسئلة في محاولة وضع بعض القواعد الأساسية.أنها في الأساس جميع تختزل إلى "كم كنت تعرف عن هذه الوثيقة؟", ولكن هنا يذهب:

  • هل تعرف إذا كان "href" النص سوف يكون دائما أقل الحالة ؟
  • هل تعرف إذا كان دائما استخدام علامات الاقتباس المزدوجة, علامات الاقتباس المفردة, أو أي رابط ؟
  • هو دائما يكون عنوان URL صالح, أو هل أنت بحاجة إلى حساب أشياء مثل '#', جافا سكريبت البيانات ؟
  • هل من الممكن العمل مع المستند حيث المحتوى يصف الميزات html (IE: href= يمكن أن يكون أيضا في الوثيقة لا تنتمي إلى علامة مرساة)?
  • ماذا يمكنك أن تخبرنا عن هذه الوثيقة ؟

لقد ربط بعض التعليمات البرمجية التي تمكنك من استخدام "LINQ to HTML"...

تبحث عن C# محلل HTML

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