2009-08-03 11 views
28

Come si analizzano in modo intelligente i dati restituiti dai risultati di ricerca su una pagina?Modo "intelligente" di analisi e utilizzo dei dati del sito web?

Ad esempio, diciamo che mi piacerebbe creare un servizio Web che cerchi libri online analizzando i risultati di ricerca di molti siti web di book provider. Potrei ottenere i dati HTML grezzi della pagina e fare alcune regex per far funzionare i dati per il mio servizio web, ma se uno qualsiasi dei siti cambia la formattazione delle pagine, il mio codice si rompe!

RSS è davvero un'opzione meravigliosa, ma molti siti non hanno una ricerca basata su XML/JSON.

Esistono kit che aiutano a diffondere automaticamente le informazioni sulle pagine? Una pazza idea sarebbe quella di avere un modulo AI sfocata riconoscere i modelli su una pagina dei risultati di ricerca, e analizzare i risultati di conseguenza ...

+0

per quanto riguarda la lingua, sono avanzato in php, ma sono disposto ad usare asp.net se necessario. grazie per tutte le risposte! – bluebit

+0

Una buona espressione regolare può essere sorprendentemente flessibile e tollerante in uso. Una buona tecnica è quella di abbinare un'area * prima * di un elemento di dati, quindi inserire i dati in un gruppo di cattura con un quantificatore pigro, quindi abbinare un'area * dopo * i dati. Se definisci le corrispondenze prima/dopo in modo flessibile, possono gestire molto bene le modifiche nella formattazione. www.regular-expressions.info offre alcune buone spiegazioni su questa e altre tecniche. – BobMcGee

risposta

23

Ho fatto parte di questo di recente, e qui ci sono le mie esperienze.

ci sono tre approcci di base:

  1. espressioni regolari.
    • Più flessibile, più semplice da utilizzare con informazioni liberamente strutturate e formati mutevoli.
    • È più difficile eseguire analisi strutturali/di tag, ma è più facile eseguire la corrispondenza del testo.
    • Convalida incorporata della formattazione dei dati.
    • più difficile da mantenere rispetto ad altri, perché si deve scrivere un espressione regolare per ogni modello che si desidera utilizzare per estrarre/trasformare il documento
    • generalmente più lento di 2 e 3.
    • funziona bene per le liste di similarly- elementi formattati
    • Un buon strumento di sviluppo/test di espressioni regolari e alcune pagine di esempio aiuteranno. Ho cose buone da dire su RegexBuddy qui. Prova la loro demo.
    • Ho avuto il maggior successo con questo. La flessibilità ti consente di lavorare con codice HTML sgradevole, brutale e selvaggio.
  2. convertire HTML in XHTML e strumenti di estrazione utilizzare XML. Ripulisci HTML, convertilo in XHTML legale e usa XPath/XQuery/X-qualunque per interrogarlo come dati XML.
    • Strumenti: TagSoup, HTMLTidy, ecc
    • qualità della conversione da HTML a XHML è molto importante, e molto variabile.
    • Soluzione ottimale se i dati desiderati sono strutturati dal layout e dai tag HTML (dati in tabelle HTML, elenchi, gruppi DIV/SPAN, ecc.)
    • Più adatto per ottenere strutture di collegamento, tabelle nidificate, immagini, elenchi e così via
    • Dovrebbe essere più veloce dell'opzione 1, ma più lenta dell'opzione 3.
    • Funziona bene se la formattazione del contenuto cambia/è variabile, ma struttura/layout del documento no.
    • Se i dati non sono strutturati da tag HTML, sei nei guai.
    • Può essere utilizzato con l'opzione 1.
  3. generatore di parser (ANTLR, ecc) - creare una grammatica per analizzare & l'analisi della pagina.
    • Non ho provato questo perché non era adatto per le mie pagine (disordinati)
    • Il più adatto se la struttura HTML è altamente strutturato, molto costante, regolare, e non cambia mai.
    • Utilizzare questo se ci sono facili da descrivere i modelli nel documento, ma se non comportano tag HTML e coinvolgono la ricorsione o comportamenti complessi
    • non richiede input da Valid
    • VELOCE produttività, generalmente
    • grande curva di apprendimento, ma più facile da mantenere

ho armeggiato con web harvest per l'opzione 2, ma trovo la sintassi di essere un po 'strano. Mix di XML e qualche linguaggio di scripting pseudo-Java. Se ti piace Java, e come l'estrazione dei dati in stile XML (XPath, XQuery), questo potrebbe essere il biglietto per te.


Edit: se si utilizzano le espressioni regolari, assicurarsi di utilizzare una biblioteca con quantificatori pigri e gruppi di cattura! Le precedenti librerie regex di PHP mancano di queste e sono indispensabili per la corrispondenza dei dati tra i tag di apertura/chiusura in HTML.

3

senza una struttura fissa HTML per analizzare, mi dispiacerebbe per mantenere le espressioni regolari per la ricerca dati. Potresti avere più fortuna nell'analisi del codice HTML tramite un parser appropriato che crea l'albero. Quindi seleziona gli elementi ... che sarebbero più manutenibili.

Ovviamente il modo migliore è un output XML dal motore con un markup fisso che è possibile analizzare e convalidare. Penserei che una libreria di analisi HTML con un sondaggio "al buio" dell'albero prodotto sarebbe più semplice da gestire rispetto alle espressioni regolari.

In questo modo, è sufficiente verificare su <a href="blah" class="cache_link">... trasformandosi in <a href="blah" class="cache_result">... o qualsiasi altra cosa.

Linea inferiore, grepping elementi specifici con regexp sarebbe triste. Un approccio migliore è quello di costruire un modello DOM della pagina e cercare "ancore" sui dati dei caratteri nei tag.

O invia un'email al sito indicando un caso per un API XML ... si potrebbe ottenere assunto!

+0

Le espressioni regolari possono essere mantenute se eseguite correttamente. Alcuni sapori consentono commenti incorporati, che possono aiutare molto. È inoltre possibile utilizzare gruppi di cattura e quantificatori pigri per abbinare gli elementi strutturali prima e dopo e acquisire i dati (con quantificatore pigro) nel mezzo. Funziona molto come il DOM o l'analisi degli alberi, ma non ha bisogno di XML pulito. – BobMcGee

1

Hai mai provato a utilizzare una libreria di manipolazione html? Ruby ne ha alcuni carini. es. hpricot

Con una buona libreria è possibile specificare le parti della pagina che si desidera utilizzando i selettori CSS o xpath. Questi sarebbero molto più robusti rispetto all'uso delle espressioni regolari.

Esempio da hpricot wiki:

doc = Hpricot(open("qwantz.html")) 
(doc/'div img[@src^="http://www.qwantz.com/comics/"]') 
    #=> Elements[...] 

Sono sicuro che si potrebbe trovare una libreria che fa cose simili in .NET o Python, ecc

3

Tu non dici quale lingua sei utilizzando. In Java land è possibile utilizzare TagSoup e XPath per ridurre al minimo il dolore. C'è un esempio da this blog (naturalmente il XPath può ottenere molto più complicato secondo le specifiche esigenze):

URL url = new URL("http://example.com"); 
SAXBuilder builder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser"); // build a JDOM tree from a SAX stream provided by tagsoup 
Document doc = builder.build(url); 
JDOMXPath titlePath = new JDOMXPath("/h:html/h:head/h:title"); 
titlePath.addNamespace("h","http://www.w3.org/1999/xhtml"); 
String title = ((Element)titlePath.selectSingleNode(doc)).getText(); 
System.out.println("Title is "+title); 

Mi consiglia esternalizzando le espressioni XPath in modo da avere un certo grado di protezione, se le modifiche del sito.

Ecco un esempio di XPath che non sto assolutamente utilizzando per visualizzare in scala questo sito.Niente da fare, non mi:

"//h:div[contains(@class,'question-summary')]/h:div[@class='summary']//h:h3" 
0

Se si può usare qualcosa di simile Tag Soup, che sarebbe un punto di partenza. Quindi potresti trattare la pagina come un'API XML, un pò.

E 'un Java e l'implementazione C++, potrebbe funzionare!

1

Purtroppo 'raschiare' è la soluzione più comune, come ha detto lei tentando di analizzare HTML dai siti web. Si potrebbe rilevare i cambiamenti strutturali alla pagina e la bandiera un avviso di correggere, quindi un cambiamento alla loro estremità non si traduca in dati bum. Fino a quando il web semantico non è una realtà, è praticamente l'unico modo per garantire un set di dati di grandi dimensioni.

In alternativa si può attaccare a piccoli insiemi di dati forniti da API. Yahoo sta lavorando duramente per fornire dati ricercabili tramite API (vedi YDN), penso che l'API di Amazon apra molti dati di libri, ecc. Ecc.

La speranza che aiuta un po '!

EDIT: E se si sta utilizzando PHP Mi consiglia SimpleHTMLDOM

2

Non hai menzionato che stack tecnologico che si sta utilizzando. Se stai parsing del codice HTML, mi piacerebbe utilizzare una libreria di analisi:

Ci sono anche webservices che fanno esattamente quello che Stai dicendo: commerciale e gratuito. Raschiano siti e offrono interfacce webservice.

E un webservice generico che offre alcuni screen scraping è Yahoo Pipes. previous stackoverflow question on that

2

non è infallibile, ma si consiglia di guardare ad un parser come Beautiful Soup Non sarà magicamente trovare lo stesso informazioni se le modifiche del layout, ma è molto più facile quindi scrivendo complesse espressioni regolari. Nota questo è un modulo python.

1

Prova a cercare su google lo scraping dello schermo + la lingua che preferisci. So diverse opzioni per Python, è possibile trovare l'equivalente per la vostra lingua preferita:

  • Beatiful Soup
  • Mechanize: simile a perl WWW: Mechanize.Ti dà un browser come oggetto da ineragire con le pagine web
  • lxml: pitone vincolante per libwww
  • scrapemark: utilizza modelli di raschiare pezzi di pagine
  • pyquery: consente di effettuare query jQuery in XML/documenti XHTML
  • Scrapy: un elevato livello di raschiatura e web crawling quadro per la scrittura di ragni a strisciare e analizzare le pagine web

seconda del sito web per raschiare potrebbe essere necessario utilizzare uno o più degli approcci di cui sopra.

-2

Abbastanza corretto, ho intenzione di utilizzare il metodo di zuppa Tag come raccomandato.

Come domanda successiva: come diavolo fanno quei grandi siti di tipo raschietto? Ho visto un motore di ricerca di lavoro (ad esempio Indeed.com) che analizza migliaia di siti! Quelle migliaia di espressioni regolari? È quasi impossibile ...

0

Il prezzemolo allo http://www.parselets.com sembra piuttosto lucido.

Permette di definire 'parsett' usando JSON cosa si definisce cosa cercare nella pagina, e quindi analizza tali dati per voi.

+2

Cosa, i collegamenti non durano 6 anni? –

Problemi correlati