سؤال

وأنا أعمل على خوارزمية التي ستحاول اقتطاف، نظرا ملف HTML، ما تراه هو العنصر الأصل أن من المرجح أن يحتوي على غالبية نص محتوى الصفحة. على سبيل المثال، فإنه اختيار شعبة "محتوى" في HTML التالية:

<html>
   <body>
      <div id="header">This is the header we don't care about</div>
      <div id="content">This is the <b>Main Page</b> content.  it is the
      longest block of text in this document and should be chosen as
      most likely being the important page content.</div>
   </body>
</html>

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

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

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

المحلول

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

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

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

وأعتقد أن الحل يعتمد على كيفية اجتياز DOM وتتبع العقد التي كنت تقوم بمسح.

ما هي اللغة الذي تستخدمه؟ أي تفاصيل أخرى لمشروعك؟ قد تكون هناك لغة معينة أو حزمة الأدوات المحددة التي يمكن أن تستخدم أيضا.

نصائح أخرى

وكلمة واحدة: Boilerpipe

وهنا تقريبا كيف سيكون التعامل مع هذا:

// get array of all elements (body is used as parent here but you could use whatever)
var elms = document.body.getElementsByTagName('*');
var nodes = Array.prototype.slice.call( elms, 0 );

// get inline elements out of the way (incomplete list)
nodes = nodes.filter(function (elm) {
  return !/^(a|br?|hr|code|i(ns|mg)?|u|del|em|s(trong|pan))$/i.test( elm.nodeName );
});

// sort elements by most text first
nodes.sort(function(a,b){
  if (a.textContent.length == b.textContent.length) return 0;
  if (a.textContent.length > b.textContent.length)  return -1;
  return 1;
});

وظائف عن طريق النسب مثل a.compareDocumentPosition(b)، يمكنك أيضا تغرق العناصر أثناء الفرز (أو بعد)، اعتمادا على مدى تعقيد هذا الشيء يجب أن يكون.

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

وأستطيع أن أقول أيضا أن البنوك هي كلمة عونا كبيرا. أي قوائم من الكلمات المشتركة "advertisey 'مثل تويتر وانقر والعديد من الأسماء رأس المال في صف واحد. يمكن وجود بلغة POS تحسين دقة. بالنسبة لمواقع الأخبار، وقائمة بجميع المدن الكبرى المعروفة في العالم يمكن أن تساعد منفصل. في الحقيقة، يمكنك أن تتخلص من ما يقرب من الصفحة دون حتى النظر في HTML.

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