web-dev-qa-db-fra.com

Web scraping - comment identifier le contenu principal d'une page Web

Étant donné une page Web d'article d'actualité (de toute source d'actualités majeure telle que Times ou Bloomberg), je souhaite identifier le contenu de l'article principal sur cette page et supprimer les autres éléments divers tels que les publicités, les menus, les barres latérales, les commentaires des utilisateurs.

Quelle est une manière générique de faire cela qui fonctionnera sur la plupart des principaux sites d'information?

Quels sont les bons outils ou bibliothèques pour l'exploration de données? (de préférence python)

46
kefeizhou

Il n'y a aucun moyen de faire cela qui fonctionne, mais une stratégie que vous pouvez utiliser est d'essayer de trouver l'élément avec le texte le plus visible à l'intérieur.

7
Amber

Il existe plusieurs façons de procéder, mais aucune ne fonctionnera toujours. Voici les deux plus simples:

  • s'il s'agit d'un ensemble fini connu de sites Web: dans votre grattoir, convertissez chaque url de l'url normale en l'url d'impression d'un site donné (ne peut pas vraiment être généralisée à travers les sites)
  • Utilisez l'algorithme de lisibilité arc90 (l'implémentation de référence est en javascript) http://code.google.com/p/arc90labs-readability/ . La version courte de cet algorithme est qu'il recherche les divs contenant des balises p. Cela ne fonctionnera pas pour certains sites Web, mais est généralement assez bon.
29
gte525u

Diffbot propose une API gratuite (10.000 urls) pour ce faire, je ne sais pas si cette approche est ce que vous recherchez, mais cela pourrait aider quelqu'un http://www.diffbot.com/

8
JordanBelf

Il y a quelque temps, j'ai écrit un simple Python script juste pour cette tâche. Il utilise une heuristique pour regrouper les blocs de texte en fonction de leur profondeur dans le DOM. Le groupe avec le plus de texte est alors supposé être le contenu principal. Ce n'est pas parfait, mais fonctionne généralement bien pour les sites d'actualités, où l'article est généralement le plus grand regroupement de texte, même s'il est divisé en plusieurs balises div/p.

Vous utiliseriez le script comme: python webarticle2text.py <url>

8
Cerin

Pour une solution en Java jetez un œil à https://code.google.com/p/boilerpipe/ :

La bibliothèque passe-partout fournit des algorithmes pour détecter et supprimer le "fouillis" excédentaire (passe-partout, modèles) autour du contenu textuel principal d'une page Web.

La bibliothèque fournit déjà des stratégies spécifiques pour les tâches courantes (par exemple: l'extraction d'articles de presse) et peut également être facilement étendue pour des paramètres de problème individuels.

Mais il y a aussi un wrapper python autour de ceci disponible ici:

https://github.com/misja/python-boilerpipe

7
asmaier

Il peut être plus utile d'extraire les flux RSS (<link type="application/rss+xml" href="..."/>) sur cette page et analysez les données du flux pour obtenir le contenu principal.

4
nedk

Une autre possibilité de séparer le contenu "réel" du bruit est de mesurer la densité HTML des parties d'une page HTML.

Vous aurez besoin d'un peu d'expérimentation avec les seuils pour extraire le contenu "réel", et je suppose que vous pourriez améliorer l'algorithme en appliquant des heuristiques pour spécifier les limites exactes du segment HTML après avoir identifié le contenu intéressant.

Mise à jour: Je viens de découvrir que l'URL ci-dessus ne fonctionne pas pour le moment; voici un lien alternatif vers une version en cache de archive.org.

3
PhilS

Je n'essaierais pas de le supprimer de la page Web - trop de choses pourraient le gâcher - mais plutôt de voir quels sites Web publient des flux RSS. Par exemple, le fil RSS du Guardian contient la plupart du texte de ses principaux articles:

http://feeds.guardian.co.uk/theguardian/rss

Je ne sais pas si le Times (The London Times, pas NY) en a un parce qu'il est derrière un paywall. Bonne chance avec ça...

0
Spacedman