2009-08-04 8 views
2

Il ne s'agit pas vraiment d'une question de programmation, mais plutôt d'une question algorithmique.Trouver le contenu du document de section HTML

Problème: Recherche de la section "contenu" d'une page HTML.

Par "contenu", j'entends le dom qui contient le contenu de la page vu par les humains, sans le bruit, simplement le "contenu réel de la page". Je sais que le problème n'est pas bien défini, mais continuons ... Par exemple dans les sites de blogs, c'est généralement facile, lorsque vous naviguez vers un poste spécifique, vous avez généralement des barres d'outils en haut de la page, peut-être un peu de navigation éléments sur le LHS, puis vous avez le div qui contient le contenu. Essayer de comprendre cela à partir du HTML peut être difficile. Heureusement, cependant, la plupart des blogs ont des flux RSS et dans le flux pour ce poste spécifique, vous trouverez une section description > (ou < contenu: codé >) et c'est exactement ce que vous voulez. Donc, pour affiner la définition de contenu, c'est la chose réelle sur la page qui contient la partie intéressante, supprimant toutes les publicités, éléments de navigation, etc Donc trouver du contenu à partir des blogs est relativement facile, en supposant qu'ils ont RSS. Idem pour les autres sites de support RSS.

Qu'en est-il des sites de nouvelles? Dans de nombreux cas, les sites d'information ont RSS, mais pas toujours. Comment trouver du contenu sur les sites de nouvelles alors? Qu'en est-il des sites plus généraux? De nombreuses pages Web (bien sûr pas toutes) ont une section de contenu et d'autres sections. Pouvez-vous penser à un bon algorithme pour trouver les sections qui sont "intéressantes" v/s le moins intéressant? Peut-être que les sections qui changent de celles qui ne changent pas?

J'espère que j'ai été clair ... Merci!

+0

Pour la majorité des pages sur le web, vous faites bien de trouver toute "partie intéressante" –

+0

Il s'agit d'une question difficile à répondre. S'il était facile d'identifier le «contenu intéressant» du bruit, alors tout le monde utiliserait un filtre de «bruit» comme Adblock est utilisé pour bloquer les publicités.Cela dit, typiquement, ce qu'un utilisateur voit (essentiellement tout le contenu du fichier html dépouillé du balisage et de la logique de script) est susceptible de contenir des "informations" et ceci peut être extrait en utilisant un convertisseur htmlToText. La classe StringBean de www.htmlparser.org peut être utilisée pour cela (Java). – hashable

Répondre

2

Je n'ai pas fait cela, mais ce serait mon approche générale.

Comme vous indiquez, le manque de structure dans les parties de contenu visible (à-dire qu'il ne contient pas de balises telles que header, navigation, ads) de HTML signifie qu'il est plus difficile à domicile sur la partie clé de la page. Mon approche serait d'enlever d'abord les éléments distincts dont vous avez définitivement décidé qu'ils ne sont pas intéressants. Une liste possible des exclusions pourrait être:

  • éléments meta tel que !doctype, head (prendre la title comme une pièce séparée de données)
  • éléments dynamiques tels que object, embed, applet, script
  • images (selon que vous souhaitez les conserver ou non), img
  • éléments de forme, c.-à-d.form, input, textarea, label, legend, select, option

Une deuxième passe pourrait alors commencer à exclure généralement se produire div ou ul noms id/classe, et tous les tags en leur sein, tels que:

  • header, footer, meta
  • nav, navigation, topnav, sidebar
  • ad, ads, adu (et d'autres noms couramment utilisés pour les annonces)

Cela permettra d'éliminer, espérons une quantité importante de la décoration de la page. Le prochain défi est d'essayer d'identifier le contenu principal à partir de ce qui reste, et je suggérerais initialement que l'auteur du site utilise correctement HTML sémantique, et utilise principalement les balises de tête/et la balise de paragraphe p.

Pour identifier le contenu, je rechercherais n'importe quelle étiquette d'en-tête qui est alors suivie par une étiquette de paragraphe (s). (Cela peut être h2 pour votre contenu principal, la balise h1 est souvent (et peut-être incorrectement) utilisé pour afficher le nom ou le logo du site, mais nous espérons que cela aura été éliminé en excluant les parties d'en-tête de la page. être ajouté au contenu actuel jusqu'à ce que vous atteigniez une pause, ce qui pourrait être la fin de l'élément div ou td, ou il pourrait s'agir d'un élément d'en-tête du même niveau que vous avez commencé. Comme il peut toujours y avoir plusieurs ensembles de contenu que vous avez rassemblés sur la page (peut-être le contenu principal plus le texte de présentation de l'auteur), vous devez tester et affiner une étape de décision ici qui choisit le plus candidat probable. Ce sera souvent simplement le plus grand, à la fois en termes de longueur et de nombre d'éléments de paragraphe utilisés. Au fur et à mesure que vous rassemblez d'autres exemples de contenu, vous pouvez ajouter des mesures de support à votre algorithme; cela pourrait être que vous remarquez beaucoup de pages utilisent div id="content" ou id="maincontent". Il peut également être utile de conserver les éléments de contenu secondaires que vous avez détectés, de sorte que si certains sites ont une manière curieuse de structurer le contenu, une fois que vous avez ajouté un capteur dans votre algorithme, il peut être réexécuté. le contenu du site.

+0

Merci, pour la réponse de longueur, je pense que je vais utiliser au moins quelques-unes des idées que vous avez. J'ai essayé d'éviter les heuristiques autant que je le pouvais mais je commence à réaliser qu'il n'y a pas d'échappatoire ... – Ran

+0

Cela fait partie du problème et du succès de la spécification HTML, le fait qu'elle soit générique signifie qu'elle n'est pas suffisamment sémantiquement riche pour couvrir la fourniture complexe d'informations (par rapport aux textes simples et académiques) exigés par les sites Web d'aujourd'hui. Je pense toujours qu'une balise nav aurait énormément aidé à isoler une grande partie de la page ... –

0

Un site bien structuré aura ses zones communes réutilisant le même code, par ex. navigation, en-tête, etc.

Lorsque vous souhaitez analyser une page cible, essayez de parcourir quelques autres pages sous le même domaine/sous-domaine et recherchez les éléments communs à toutes les pages. Ce sont les bruits dont vous voulez vous débarrasser.

Ensuite, vous pouvez jeter un coup d'œil à ce qui reste, pour voir si des bruits se sont glissés. Lorsque vous avez collecté une quantité raisonnable de ces données, essayez de trouver un motif dans celles-ci. Affinez votre logique et répétez.

Questions connexes