2016-05-01 11 views
0

Ich scrapping einfache Textdateien von einer URL.urlopen erstickt mich mit Zeilenumbrüchen

def scrape_contents_ex(url): 
    data = urllib2.urlopen(url) 
    return data.read() 

Das Problem ist, dass die Zeichenfolge es ergibt sich mit Neuen-Zeile und Tabulatoren "\ t" erstickt "\ r" usw.

Beispiel:

Hier ist die Homepage enter image description here

Wenn ich String Ausgabe in python zu drucken, macht es mit verschiedenen \ Zeichen:

enter image description here

Ich weiß nicht, wie man die Ausgabe, die ich von urlopen lese, richtig handhabe. Ich möchte diese Inhalte in postgresql speichern. Außerdem habe ich eine weitere Komplikation, bei der der Inhalt höchstwahrscheinlich Unicode-Ergebnisse ergibt (chinesische Schriftzeichen, kyrillisch usw.).

Was ist der richtige und robuste Weg, dies zu lesen und zu speichern?

Antwort

0

Sie können die str.split() Methode verwenden, obwohl es viele Optionen gibt, um dieses spezielle Problem zu lösen.

Aus den Python 3.5.1 docs:

>>> '1,2,3'.split(',') 
['1', '2', '3'] 
>>> '1,2,3'.split(',', maxsplit=1) 
['1', '2,3'] 
>>> '1,2,,3,'.split(',') 
['1', '2', '', '3', ''] 

Sie würden so etwas wie

wollen
return data.read().split('\n\t') 

Das Ergebnis ist eine Liste von Zeichenketten zwischen irgendwelchen Instanzen von '\ n \ t' auftretende Ihre ursprüngliche Zeichenfolge.

+0

völlig unabhängig, was fragte Sie, aber ich fand die Anfragen Bibliothek viel besser zu sein als urllib2. – ajthyng

0

foo Bytestring in Ihrem Fall ist. Wenn es Text darstellt; Sie sollten es in Unicode entschlüsseln, bevor Sie es in PostgreSQL speichern: text = foo.decode(character_encoding) Der Zeichensatz kann vom Inhaltstyp abhängen. Siehe A good way to get the charset/encoding of an HTTP response in Python.

Dann geben Sie foo auf die Eingabeaufforderung, ipython versucht, das foo Objekt anzuzeigen und es kann repr(foo) nennen.

Was Sie sehen: "a\nb" (das Ergebnis der repr() Anruf) ist eine druckbare Darstellung des Python-Objekt mit dem Typ str (type(foo) == str). Python-Zeichenfolgenliterale verwenden die gleiche Syntax. Der umgekehrte Schrägstrich ist innerhalb der Zeichenfolge Literale z. B. "\n" ist ein einzelnes Zeichen (ein Newline-ord("\n") == 10). Wenn Sie eine Zeichenfolge erstellen möchten, die zwei Zeichen enthält: backslash + n dann müssen Sie den Backslash oder rohe Stringliterale:

>>> "\\n" == r"\n" != "\n" 
True 
Verwandte Themen