Domanda

Devo analizzare una serie di pagine web al fine di importare i dati in un'applicazione. Ogni tipo di pagina web fornisce lo stesso tipo di dati. Il problema è che il codice HTML di ogni pagina è diversa, quindi la posizione dei dati varia. Un altro problema è che il codice HTML è mal formattato, rendendo impossibile utilizzare un parser XML-like.

Finora, la strategia migliore che posso pensare, è quello di definire un modello per ogni tipo di pagina, ad esempio:

Modello A:

<html>
...
  <tr><td>Table column that is missing a td 
      <td> Another table column</td></tr>
  <tr><td>$data_item_1$</td>
...
</html>

Modello B:

<html>
...
  <ul><li>Yet another poorly formatted page <li>$data_item_1$</td></tr>
...
</html>

In questo modo avrei solo bisogno di un unico parser per tutte le pagine, che avrebbe confrontare ogni pagina con il suo modello e il recupero della $data_item_1$, $data_item_2$, ecc Eppure, sta per essere un sacco di lavoro. Riuscite a pensare a una soluzione più semplice? Ogni biblioteca che può aiutare?

Grazie

È stato utile?

Soluzione

È possibile passare sorgente della pagina attraverso ordinata per ottenere una pagina valida. Si possono trovare in ordine qui . Tidy ha binding per un sacco di linguaggi di programmazione. Dopo aver fatto questo, è possibile utilizzare il parser tecnica di estrazione / contenuti preferiti.

Altri suggerimenti

Mi consiglia Html Agility pacchetto . Ha la capacità di lavorare con poco HTML strutturato mentre si dà Xml come selezione utilizzando XPath. Si dovrebbe ancora al modello oggetti o selezionare con diverse selezioni e analizzare, ma si arriva oltre la povera gobba della struttura.

qui e su altri SO risposte prima, bella zuppa grado di analizzare strano HTML.

  

Beautiful Soup è un parser / XML Python HTML progettato per i progetti di turnaround veloci come screen-scraping. Tre caratteristiche lo rendono potente:

     
      
  1. Beautiful Soup non soffocare se si dà cattivo markup. Si produce un albero sintattico che rende circa come molto senso come il documento originale. Questo è di solito sufficiente per raccogliere i dati necessari e scappare.
  2.   
  3. Beautiful Soup fornisce alcuni semplici metodi e modi di dire Pythonic per la navigazione, la ricerca, e la modifica di un albero sintattico: un toolkit per sezionare un documento e l'estrazione di che cosa avete bisogno. Non è necessario creare un parser personalizzato per ogni applicazione.
  4.   
  5. Beautiful Soup converte automaticamente i documenti in arrivo a Unicode e documenti in uscita a UTF-8. Non dovete pensare a codifiche, a meno che il documento non specifica una codifica e bella minestra non può rilevare automaticamente uno. Poi basta specificare la codifica originale.
  6.   
     

Beautiful Soup analizza tutto ciò che si dà, e fa la roba albero di attraversamento per voi. Si può dire che "Trova tutti i link", o "Trova tutti i link della classe externalLink", o "Trova tutti i collegamenti i cui URL corrisponde a 'foo.com', o" trovare la tabella voce che il testo in grassetto ha ottenuto, poi dare me che il testo ".

Utilizzare HTML5 analizzatore come html5lib .

A differenza di HTML Tidy, questo vi darà la gestione degli errori molto vicino a quello che i browser.

Ci sono un paio di C # discussioni specifiche su questo, come cerca di C # parser HTML .

A seconda di quali dati è necessario estrarre le espressioni regolari potrebbe essere un'opzione. Conosco un sacco di gente sarà rabbrividire al pensiero di usare espressioni regolari sui dati strutturati, ma il fatto è semplice (come avete scoperto) che un sacco di HTML non è in realtà ben strutturata e può essere molto difficile da analizzare.

Ho avuto un problema simile a te, ma nel mio caso ho voluto solo una parte specifica di dati dalla pagina che era facile da identificare, senza l'analisi del codice HTML in modo da un RegEx ha lavorato molto bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top