2011-01-12 12 views
38

Dato una pagina Web di articoli di notizie (da qualsiasi fonte di notizie importanti come times o bloomberg), voglio identificare il contenuto dell'articolo principale su quella pagina e buttare fuori gli altri elementi misc come annunci, menu, barre laterali, commenti degli utenti.Web scraping: come identificare il contenuto principale di una pagina Web

Qual è un modo generico per farlo che funzionerà sulla maggior parte dei principali siti di notizie?

Quali sono alcuni buoni strumenti o librerie per il data mining? (preferibilmente basato su Python)

+5

vedere come 'Readability' segnalibro è implementato http://lab.arc90.com/experiments/readability/ – jfs

+0

A browser che fa questo sarebbe una grande minaccia per gli annunci online. –

+2

il codice del bookmarklet originale è qui: http://code.google.com/p/arc90labs-readability/source/browse/ 'Readability' è ora un servizio e il suo codice non è disponibile. – lsh

risposta

4

Non c'è modo di fare ciò che è garantito per funzionare, ma una strategia che si potrebbe usare è cercare di trovare l'elemento con il testo più visibile al suo interno.

4

Potrebbe essere più utile estrarre i feed RSS (<link type="application/rss+xml" href="..."/>) su quella pagina e analizzare i dati nel feed per ottenere il contenuto principale.

+0

NB: per i feed di ATOM 'type =" application/atom + xml "' – nedk

+0

Una buona idea, ma questa può essere incostante, poiché molti feed includono solo un riepilogo dell'articolo. Il che è comprensibile, dal momento che la maggior parte dei siti di notizie ha lo scopo di farti visualizzare gli annunci, che generalmente non farai all'interno di un lettore RSS. – Cerin

0

Non proverei a scriverlo dalla pagina Web - troppe cose potrebbero rovinarlo - ma vedere quali siti web pubblicano i feed RSS. Ad esempio, feed RSS del Guardian ha la maggior parte del testo dai loro articoli di fondo:

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

Non so se il Times (The Times di Londra, non NY) ha una, perché è dietro un paywall. Buona fortuna ...

+0

La maggior parte dei feed RSS che ho visto hanno solo brevi riassunti degli articoli completi. – kefeizhou

27

Ci sono diversi modi per farlo, ma nessuno funzionerà sempre. Ecco i due più semplice:

  • se si tratta di un insieme finito nota del sito web nel vostro raschietto convertire ogni URL dall'URL normale per l'url di stampa per un determinato sito (non può davvero essere generalizzato a tutti i siti)
  • Utilizzare l'algoritmo di leggibilità arc90 (l'implementazione di riferimento è in javascript) http://code.google.com/p/arc90labs-readability/. La versione breve di questo algoritmo è che cerca le div con tag p al loro interno. Non funzionerà per alcuni siti Web ma generalmente è abbastanza buono.
+3

+1 per la leggibilità. Dal momento che la leggibilità funziona meglio per le pagine degli articoli rispetto alle home page, funzionerebbe meglio quando un feed RSS viene analizzato per gli URL degli articoli. – nedk

+1

Avrei dovuto aggiungere collegamenti alle porte python dell'algoritmo di leggibilità: http://github.com/search?type=Repositories&language=python&q=readability&repo=&langOverride=&x=22&y=9&start_value=1 – gte525u

+0

Mi chiedo perché non l'ho fatto lo scopri prima. È stato superbo, rispetto ai precedenti metodi ad-hocs che ho sviluppato io stesso. – Pankaj

3

Un'altra possibilità di separare il contenuto "reale" dal rumore è di measuring HTML density delle parti di una pagina HTML.

Avrete bisogno di un po 'di sperimentazione con le soglie per estrarre il contenuto "reale", e immagino che potreste migliorare l'algoritmo applicando l'euristica per specificare i limiti esatti del segmento HTML dopo aver identificato il contenuto interessante.

Aggiornamento: ho appena scoperto che l'URL sopra non funziona in questo momento; here is an alternative link in una versione memorizzata nella cache di archive.org.

8

Qualche tempo fa ho scritto un simple Python script proprio per questo compito. Utilizza un'euristica per raggruppare blocchi di testo in base alla loro profondità nel DOM. Si presume che il gruppo con il maggior numero di testo sia il contenuto principale. Non è perfetto, ma funziona generalmente bene per i siti di notizie, dove l'articolo è generalmente il più grande raggruppamento di testo, anche se suddiviso in più tag div/p.

usereste lo script come: python webarticle2text.py <url>

+0

il link non funziona più –

+0

@ MPękalski, grazie per avermelo fatto notare. Ho aggiornato il link. – Cerin

8

Diffbot offre un libero (10.000 URL) API per farlo, non so se questo approccio è quello che stai cercando, ma potrebbe aiutare qualcuno http://www.diffbot.com/

+0

Bello, ho pensato per un po 'di tempo a costruire qualcosa di simile =) –

6

Per una soluzione in Java dare un'occhiata a https://code.google.com/p/boilerpipe/:

Il La libreria boilerpipe fornisce algoritmi per rilevare e rimuovere l'eccedenza di "ingombro" (testo, modelli) attorno al contenuto testuale principale di una pagina web.

La libreria fornisce già strategie specifiche per attività comuni (ad esempio: estrazione di articoli di notizie) e può anche essere facilmente estesa per le impostazioni dei singoli problemi.

Ma c'è anche un wrapper pitone intorno a questo disponibile qui:

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

Problemi correlati