2012-06-05 10 views
5

Ho bisogno di aiuto con un raschietto che sto scrivendo. Sto cercando di analizzare un tavolo delle classifiche universitarie, e alcune di quelle scuole sono università europee con caratteri stranieri nei loro nomi (ad esempio ä, ü). Sto già raschiando un altro tavolo su un altro sito con università straniere nello stesso identico modo, e tutto funziona bene. Ma per qualche ragione, l'attuale raschietto non funziona con caratteri stranieri (e per quanto riguarda l'analisi di caratteri stranieri, i due raschietti sono esattamente gli stessi).Problema con sito di scraping con caratteri stranieri

Ecco quello che sto facendo per cercare & far funzionare le cose: la codifica

  1. Declare sulla prima riga del file:

    # -*- coding: utf-8 -*- 
    
  2. Importazione & utilizzando unicode intelligente da django quadro da django.utils.encoding importazione smart_unicode

    school_name = smart_unicode(html_elements[2].text_content(), encoding='utf-8',   
    strings_only=False, errors='strict').encode('utf-8') 
    
  3. Utilizzare la funzione di codifica, come visto sopra quando concatenato con la funzione smart_unicode. Non riesco a pensare a cos'altro potrei fare male. Prima di trattare con questi scrapers, non ho davvero capito molto della codifica diversa, quindi è stata un'esperienza di apertura. Ho provato a leggere quanto segue, ma ancora non può superare questo problema

Capisco che in una codifica, ogni personaggio è assegnato un numero, che può essere espresso in esadecimale, binario, ecc. Diverse codifiche hanno capacità diverse per il numero di lingue supportate (ad es. ASCII supporta solo Inglese, UTF-8 supporta tutto ciò che sembra. Tuttavia, mi sento come se stessi facendo tutto il necessario per garantire che i caratteri siano stampati correttamente. Non so dove sia il mio errore, e mi sta facendo impazzire. Per favore aiuto !!

+3

FYI, (1) imposta solo la codifica del file sorgente Python, in modo che è possibile incorporare caratteri non ASCII nel codice; non fa nulla di negativo input Output. –

+0

Ah ok, non lo sapevo. Grazie per avermi fatto sapere. – user642547

+0

'ASCII supporta solo l'inglese' Beh, non proprio. Esistono altri linguaggi "supportati" da ASCII. – dda

risposta

2

Quando l'estrazione di informazioni da una pagina web, è necessario determinare la sua codifica dei caratteri, in modo simile a come i browser fare queste cose (che analizzano le intestazioni HTTP, parsing del codice HTML per trovare meta tag e possibilmente congetture sulla base dei dati effettivi, ad esempio, il presenza di qualcosa che sembra BOM in qualche codifica). Spero che tu possa trovare una routine di libreria che faccia questo per te.

In ogni caso, non ci si deve aspettare che tutti i siti Web siano codificati in utf-8. L'Iso-8859-1 è ancora molto diffuso, e in generale la lettura di iso-8859-1 come se fosse utf-8 risulta in un gran casino (per qualsiasi personaggio non-Ascii).

-1

È necessario prima di guardare il <head> parte del documento e vedere se c'è charset informazioni:

<meta http-equiv="Content-Type" content="text/html; charset=xxxxx"> 

(Si noti che StackOverflow, questa stessa pagina, non ha alcuna informazione charset ... I mi chiedo come 中文字, che ho digitato assumendo che sia UTF-8 qui, verrà visualizzato su PeeCees cinesi che sono probabilmente configurati come GBK, o giapponese pasokon che sono ancora saldamente in terra Shift-JIS).

Quindi, se si dispone di un set di caratteri, si sa cosa aspettarsi e affrontarlo di conseguenza. In caso contrario, dovrai fare qualche ipotesi istruita - ci sono caratteri non ASCII (> 127) nella versione di testo in chiaro della pagina? Esistono entità HTML come &#19968; (一) o &#233; (é)?

Dopo aver indovinato/verificato la codifica della pagina, è possibile convertirlo in UTF-8 e proseguire.

+0

Le meta informazioni in HTML non hanno nulla a che fare con le intestazioni HTTP. – schlamar

+0

E SO ha un'impostazione charset nell'intestazione: 'Content-Type: text/html; charset = utf-8' – schlamar

+0

Sto guardando la sorgente HTML ora e non ci sono informazioni sul set di caratteri ... – dda

0

Se si utilizza lo requests library, esso decodificherà automaticamente il contenuto in base alle intestazioni HTTP. Ottenere il contenuto HTML di una pagina è molto semplice:

>>> import requests 
>>> r = requests.get('https://github.com/timeline.json') 
>>> r.text 
'[{"repository":{"open_issues":0,"url":"https://github.com/... 
Problemi correlati