2009-04-28 8 views
8

Ovviamente una pagina HTML può essere analizzata usando un numero qualsiasi di parser Python, ma sono sorpreso che non ci siano script di analisi pubblici da estrarre contenuto significativo (escluse le barre laterali, la navigazione, ecc.) da un determinato documento HTML.metodo python per estrarre il contenuto (navigazione esclusa) da una pagina HTML

Immagino che sia qualcosa come raccogliere gli elementi DIV e P e quindi controllarli per una quantità minima di contenuto di testo, ma sono sicuro che una solida implementazione includerebbe molte cose a cui non avevo pensato.

+1

Questo JS script per il bookmarklet leggibilità sembra funzionare sorprendentemente bene: http://lab.arc90.com/experiments/readability/js/readability.js – jamtoday

+0

Cosa si intende per "significativo"? Quale regola può utilizzare un programma per distinguere "significativo" dalle cose che dovrebbero essere escluse? Questa regola funziona universalmente? –

+0

Significativo, intendo semplicemente il tipo di contenuto che la leggibilità estrae. Ovviamente questo non funzionerebbe bene su alcuni tipi di siti, ma principalmente guardo blog e siti di notizie in cui vorresti estrarre i più grandi blocchi di testo. – jamtoday

risposta

5

Provate la libreria Beautiful Soup per Python. Ha metodi molto semplici per estrarre informazioni da un file html.

Provare a estrarre genericamente dati da pagine Web richiederebbe alle persone di scrivere le proprie pagine in un modo simile ... ma c'è un numero quasi infinito di modi per trasmettere una pagina che sembra identica, figuriamoci tutte le connessioni che si possono avere per trasmettere le stesse informazioni.

Esiste un particolare tipo di informazioni che stavi tentando di estrarre o un altro obiettivo finale?

Si potrebbe provare a estrarre qualsiasi contenuto nei marcatori 'div' e 'p' e confrontare le dimensioni relative di tutte le informazioni nella pagina. Il problema quindi è che le persone probabilmente raggruppano le informazioni in raccolte di "div" e "p" (o almeno lo fanno se scrivono html ben formato!).

Forse se hai formato un albero di come le informazioni sono correlate (i nodi sarebbero la 'p' o 'div o qualsiasi altra cosa e ogni nodo conterrà il testo associato) potresti fare una sorta di analisi per identificare il più piccolo' p 'o' div 'che racchiude quella che sembra essere la maggior parte delle informazioni ..?

[EDIT] Forse se riesci a metterlo nella struttura ad albero, ho suggerito, potresti quindi utilizzare un sistema di punti simile allo spam assassino. Definire alcune regole che tentano di classificare le informazioni. Alcuni esempi:

+1 points for every 100 words 
+1 points for every child element that has > 100 words 
-1 points if the section name contains the word 'nav' 
-2 points if the section name contains the word 'advert' 

Se avete un sacco di regole a basso punteggio che si sommano quando si trova più relevent cercando sezioni, penso che potrebbe evolversi in una tecnica abbastanza potente e robusto.

[EDIT2] Osservando la leggibilità, sembra che stia facendo praticamente esattamente quello che ho appena suggerito! Forse potrebbe essere migliorato per cercare di capire meglio i tavoli?

+0

Questo è quello che avevo in mente, ma sono ancora sorpreso dal fatto che non ci sia una semplice libreria o un plugin BeautifulSoup che funzioni per te, dal momento che immagino che l'estrazione di contenuti da un HTML possa usare questo tipo di regole senza variazione> 90% delle volte ... – jamtoday

+0

dipende davvero da cosa stai cercando; Quasi ogni singolo raschietto che ho scritto è stato alla ricerca di un sacco di piccoli frammenti di informazioni piuttosto che i più grandi frammenti di testo (che sono spesso informazioni generiche sul sito). –

+0

Un'ulteriore interessante nota a margine: lo script di "leggibilità" basato su javascript esegue anche l'estrazione del contenuto (o meglio la selezione). Può essere spogliato anche per idee/algoritmo. Anche se non è completamente successo. – HoverHell

1

Ciò che è significativo e ciò che non lo è, dipende dalla semantica della pagina. Se la semantica è schifosa, il tuo codice non "indovina" ciò che è significativo. Io uso la leggibilità, che hai collegato nel commento, e vedo che su molte pagine cerco di leggerlo non fornisce alcun risultato, non parlo di uno decente.

Se qualcuno inserisce il contenuto in un tavolo, sei condannato. Prova la leggibilità su un forum phpbb vedrai cosa intendo.

Se si desidera eseguire questa operazione, eseguire un'espressione regolare su <p></p> o analizzare il DOM.

+0

Se guardi all'origine, vedrai che StackOverflow usa le tabelle per il layout in alcuni punti !! –

+0

ma ha testo nei paragrafi !! non solo in td come nei forum di merda !! e non c'è bisogno di gridarlo !! – zalew

+0

Verissimo, sono rimasto sorpreso che SO abbia usato le tabelle per il layout. Certo, le tabelle sono spesso rese in modo più affidabile ma css e più "div" e "p" sarebbero una soluzione migliore per la leggibilità (gli screen reader hanno più problemi con le tabelle per esempio) .. –

4

Dai un'occhiata alla templatemaker: http://www.holovaty.com/writing/templatemaker/

E 'scritto da uno dei fondatori di Django. Fondamentalmente gli metti da parte alcuni file html di esempio e genererà un "template" che potrai usare per estrarre solo i bit che sono diversi (che di solito è il contenuto significativo).

Ecco un esempio dalla google code page:

 

# Import the Template class. 
>>> from templatemaker import Template 

# Create a Template instance. 
>>> t = Template() 

# Learn a Sample String. 
>>> t.learn('<b>this and that</b>') 

# Output the template so far, using the "!" character to mark holes. 
# We've only learned a single string, so the template has no holes. 
>>> t.as_text('!') 
'<b>this and that</b>' 

# Learn another string. The True return value means the template gained 
# at least one hole. 
>>> t.learn('<b>alex and sue</b>') 
True 

# Sure enough, the template now has some holes. 
>>> t.as_text('!') 
'<b>! and !</b>' 
 
3

Si potrebbe utilizzare il boilerpipe Web application per recuperare ed estrarre il contenuto al volo.

(Questo non è specifico per Python, poiché è necessario solo inviare una richiesta HTTP GET a una pagina su Google AppEngine).

Cheers,

cristiane

+0

al primo sguardo veloce, questo sembra molto bello. sarebbe bello se ci fosse qualcosa di esattamente come una biblioteca. Grazie! –

0

Goose è solo la libreria per questo compito. Per citare il loro README:

oca cercherà di estrarre le seguenti informazioni:

  • testo principale di un articolo
  • immagine principale dell'articolo
  • qualsiasi film Youtube/Vimeo incorporati nell'articolo
  • Meta Description
  • Meta tag
Problemi correlati