سؤال

صباح الخير! أنا أستخدم C# (Framework 3.5SP1) وأريد تحليل جزء من HTML عبر Regex:

<h1>My caption</h1>
<p>Here will be some text</p>

<hr class="cs" />
<h2 id="x">CaptionX</h2>
<p>Some text</p>

<hr class="cs" />
<h2 id="x">CaptionX</h2>
<p>Some text</p>

<hr class="cs" />
<h2 id="x">CaptionX</h2>
<p>Some text</p>

أحتاج إلى الإخراج التالي:

  • المجموعة 1: محتوى H1
  • المجموعة 2: محتوى نص H1 متابع
  • المجموعة 3-N: محتوى الفرع الفرعي + النص

ما لدي أجهزة الصراف الآلي:

<hr.*?/>
<h2.*?>(.*?)</h2>
([\W\S]*?)
<hr.*?/>

سيعطيني هذا كل محتوى فرعي فرعي + محتوى (على سبيل المثال 1 ، 3 ، ...) بسبب الخلاف <hr/>. لتحليل caption H1 لدي نمط آخر (<h1.*?>(.*?)</h1>) ، وهو ما يعطيني فقط التسمية التوضيحية ولكن ليس المحتوى - أنا بخير مع جهاز الصراف الآلي هذا.

هل لدى أي شخص تلميح/حل لي أو أي منطق بديل (على سبيل المثال ، تحليل HTML عبر القارئ وتعيينه بهذه الطريقة؟)؟

تعديل:
كما جلب البعض htmlagilitypack, ، كنت فضوليًا بشأن هذه الأداة الجميلة. لقد أنجزت الحصول على محتوى <h1>-بطاقة شعار.
ولكن ... myprobled يتم تحليل الباقي. هذا ناتج عن: علامات المحتوى قد تختلف - من <p> ل <div> و <ul>... أجهزة الصراف الآلي هذا يبدو أكثر أو أقل تكرار على الوثيقة بأكملها وعلامة التحليل للعلامة ...؟ أي تلميحات؟

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

المحلول

سوف تحتاج حقا HTML Parser لهذا

نصائح أخرى

لا تستخدم Regex لتحليل HTML. النظر في استخدام HTML ATCILITY PACK.

هناك بعض الاحتمالات:

Regex - سريع ولكن غير موثوق به ، لا يمكن التعامل مع HTML المشوهة.

htmlagilitypack - جيد ، ولكن لديك العديد من تسرب الذاكرة. إذا كنت ترغب في التعامل مع بعض الملفات ، فلا توجد مشكلة.

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

http://developer.mindtouch.com/sgmlreader

مهيب 12 - جيد ولكن ليس سريعًا مثل SGMLReader.

http://www.majestic12.co.uk/projects/html_parser.php

مثال على SGMLReader (VB.NET)

Dim sgmlReader As New Sgml.SgmlReader()
Public htmldoc As New System.Xml.Linq.XDocument
sgmlReader.DocType = "HTML"
sgmlReader.WhitespaceHandling = System.Xml.WhitespaceHandling.All
sgmlReader.CaseFolding = Sgml.CaseFolding.ToLower
sgmlReader.InputStream = New System.IO.StringReader(vSource)
sgmlReader.CaseFolding = CaseFolding.ToLower
htmldoc = XDocument.Load(sgmlReader)    
Dim XNS As XNamespace 

' In this part you can have a bug, sometimes it cant get the Default Namespace*********
Try
      XNS = htmldoc.Root.GetDefaultNamespace
Catch
        XNS = "http://www.w3.org/1999/xhtml"
End Try
If XNS.NamespaceName.Trim = "" Then
        XNS = "http://www.w3.org/1999/xhtml"
End If

'use it with the linq commands
For Each link In htmldoc.Descendants(XNS + "script")
        Scripts &= link.Value
Next

في Majestic-12 مختلفة ، عليك المشي إلى كل علامة مع أمر "التالي". يمكنك العثور على رمز مثال مع DLL.

كما ذكر آخرون ، استخدم htmlagilitypack. ومع ذلك ، إذا كنت تحب محددات JQuery/CSS ، فقد وجدت للتو شوكة من htmlagilitypack تسمى Fizzler:http://code.google.com/p/fizzler/باستخدام هذا يمكنك أن تجد كل شيء <p> العلامات باستخدام:

var pTags = doc.DocumentNode.QuerySelectorAll('p').ToList();

أو ابحث عن div محددة مثل <div id="myDiv"></div>:

var myDiv = doc.DocumentNode.QuerySelectorAll('#myDiv');

لا يمكن أن تحصل على أي أسهل من ذلك!

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