2016-05-11 8 views
1

Ich bin derzeit auf einem Crawler arbeiten in Python, die bereits ein Genre Seite auf http://lyrics.wikia.com/ kriechen alle Bands und Alben zu bekommen und dann kriecht diese Links um die Links zu bestimmten Songs zu bekommen, um die Texte endlich zu parsen und in eine Datenbank zu stellen, damit sie mir bei der Analyse lyrischer Inhalte helfen kann.Proper Parsen einer HTML-Seite mit entkam ascii-strings

bekam ich meine Crawler all diese Schritte zu tun, aber wenn ich die html von der lyrischen Seite mit urllib und beautifulsoup ich seltsam Inhalt analysieren. Ich habe das untersucht und es scheint ein Skript zu geben, das Leute davon abhält zu kriechen? Wenn man sich den HTML-Quellcode anschaut, ist der Text wie folgt verschlüsselt. Ich weiß nicht, wie ich das nennen soll, so traurig, dass ich selbst nicht weiter forschen konnte, ohne zu wissen, wonach ich suchen sollte.

<div class='lyricbox'>&#73;&#116;&#32;&#119;&#97;&#115;&#32;&#119;&#104;&#101;&#110;&#32;&#73;&#32;&#114;&#101;&#97;&#108;&#105;&#122;&#101;&#100;<br />&#116;&#104;&#97;&#116;&#32;&#108;&#105;&#102;&#101;&#32;&#104;&#97;&#115;&#32;&#110;&#111;&#32;&#109;&#101;&#97;&#110;&#105;&#110;&#103;<br />&#110;&#111;&#32;&#112;&#117;&#114;&#112;&#111;&#115;&#101;&#44;&#32;&#110;&#111;&#32;&#113;&#117;&#97;&#114;&#114;&#121;<br />&#46;&#46;&#46;&#110;&#111;&#32;&#97;&#110;&#115;&#119;&#101;&#114;&#101;&#115;&#46;&#46;&#46;<br /><br />&#65;&#110;&#100;&#32;&#97;&#108;&#108;&#32;&#116;&#104;&#101;&#32;&#100;&#114;&#101;&#97;&#114;&#121;&#32;&#110;&#105;&#103;&#104;&#116;<br />&#116;&#104;&#97;&#116;&#32;&#104;&#97;&#100;&#32;&#98;&#101;&#102;&#97;&#108;&#108;&#101;&#110;&#32;&#97;&#99;&#114;&#111;&#115;&#115;<br />&#116;&#104;&#101;&#32;&#108;&#97;&#110;&#100;<br />&#73;&#32;&#115;&#108;&#105;&#112;&#112;&#101;&#100;&#32;&#105;&#110;&#116;&#111;&#32;&#97;&#32;&#114;&#101;&#118;&#101;&#114;&#121;<br />&#97;&#32;&#119;&#101;&#98;&#32;&#111;&#102;&#32;&#104;&#117;&#109;&#97;&#110;&#32;&#104;&#97;&#110;&#100;<br /><br />&#89;&#111;&#117;&#32;&#108;&#111;&#110;&#103;&#101;&#100;&#32;&#116;&#111;&#32;&#115;&#111;&#97;&#114;&#32;&#117;&#112;&#32;&#104;&#105;&#103;&#104;<br />&#116;&#111;&#32;&#99;&#97;&#114;&#101;&#115;&#115;&#32;&#116;&#104;&#101;&#32;&#115;&#105;&#108;&#107;&#121;&#32;&#119;&#105;&#110;&#100;&#115;<br />&#116;&#111;&#32;&#101;&#109;&#98;&#114;&#97;&#99;&#101;&#32;&#97;&#110;&#100;&#32;&#107;&#105;&#115;&#115;&#32;&#97;&#115;&#32;&#108;&#111;&#118;&#101;&#114;&#115;<br />&#46;&#46;&#46;&#116;&#104;&#101;&#32;&#101;&#116;&#104;&#101;&#114;&#46;&#46;&#46;<br /><br 

Bei der Untersuchung mit dem Google Chrome-Entwickler-Tool können die Texte gelesen werden.

Die Beispielseite war: http://lyrics.wikia.com/wiki/Agalloch:The_Wilderness

So lange Geschichte kurz: Was ist das? Woher kommt das? Wie finde ich eine Problemumgehung? (Bedenken Sie, dass ich tun möchte, dass mit rund 20000 Seiten, so bevorzugt es sein muss schnell und/oder iteratable

Vielen Dank im Voraus

Antwort

1

Sie sollten Code schreiben, den wir helfen können zu debuggen, verwenden Sie nicht das richtige Encoding-Schema, das ich rate Import requests funktioniert für mich :

>>> import requests 
>>> import bs4 
>>> url = "http://lyrics.wikia.com/wiki/Agalloch:The_Wilderness" 
>>> req = requests.get(url) 
>>> soup = bs4.BeautifulSoup(req.text, "html.parser") 
>>> lyrics = soup.find("div", {"class":"lyricbox"}) 
>>> lyrics.get_text().rstrip() 

Dies wird zurück: So

"It was when [... ] the cosmos...Forevermore..." 
+0

Vielen Dank, das funktioniert! Ich benutzte fast das gleiche, außer dass ich urllib benutzte, um "req" zu erhalten, lxml als Parser anstelle von html.parser und ich nicht get_text(). Rstrip().Ich denke, ich werde meinen Beitrag nicht bearbeiten, um zu zeigen, was ich meinen Code hatte, da dieser jetzt beantwortet wird (oder sollte ich das noch?) – sorh

+0

Dir geht es gut, die Frage ist immer noch die gleichen Leute bekommen Antworten wie deine in der Zukunft und dieser Thread hat einige andere großartige Antworten auf Encoding/Decoding – Tony

0

Das sind HTML-codierte Zeichen: http://www.ascii.cl/htmlcodes.htm

Sie müssen nur sie decodieren.Es gibt wahrscheinlich ein vorhandenes Werkzeug, mit dem Sie sie decodieren können

+0

Ich habe gerade gelernt, dass mein Modul dies normalerweise dank Tonys Antwort zu tun scheint. Danke trotzdem – sorh

0

, es stellt sich heraus, dass diejenigen, ganzzahlige Werte von ASCII-Zeichen sind. In Ihrem Skript könnten Sie so etwas machen, um druckbare Ascii zurück zu bekommen!

>>> a = '&#73;&#116;&#32;&#119;&#97;&#115;&#32;&#119;&#104;&#101;&#110;&#32;&#73;&#32;&#114;&#101;&#97;&#108;&#105;&#122;&#101;&#100;' 
>>> ''.join(map(chr,map(int,a.replace('&#','').split(';')[:-1])))       
'It was when I realized' 

Hoffe, das hilft!

+0

Danke, ich verstehe nicht, warum genau du das tust, aber ich lese in die Theorie der ASCII-Zeichen, so dass ich in der Zukunft werde. – sorh

+0

Ich nehme im Grunde genommen die rohe Zeichenkette mit all den zusätzlichen Sachen darin, entferne alle Instanzen von '& #' und spalte dann die verbleibende Zeichenkette in eine Liste bei jedem Vorkommen eines Semikolons. Es gibt ein Semikolon am Ende, was zu einem leeren Element führt, also ignorieren wir das letzte Zeichen mit '[: -1]'. Da alle Elemente eine Zeichenfolge sind, möchten Sie diese alle auf Ganzzahlen abbilden und dann die resultierenden Ganzzahlen der Ascii-Darstellung der Ints zuordnen. Du erhältst eine Liste von Charakteren. Wenn Sie die Elemente mit einem leeren Zeichen verbinden, erhalten Sie die Zeichenfolge, nach der Sie suchen. – stackunderflow

+0

Das klingt plausibel, danke für die Erklärung. Ich könnte einen weiteren Blick in die Karte Befehl – sorh

0

Diese sind maskierte HTML-Abfragen, z. B. &amp; für &. und &amp; hat eine dezimale und hexadezimale äquivalente Darstellung. Dein Text ist mit Dezimalzahlen gespickt. Hier ist, wie Sie es tun.

import html 
s = "<div class='lyricbox'>&#73;&#116;&#32;&#119;&#97;&#115;&#32;&#119;&#104;&#101;&#110;&#32;&#73;&#32;&#114;&#101;&#97;&#108;&#105;&#122;&#101;&#100;<br />&#116;&#104;&#97;&#116;&#32;&#108;&#105;&#102;&#101;&#32;&#104;&#97;&#115;&#32;&#110;&#111;&#32;&#109;&#101;&#97;&#110;&#105;&#110;&#103;<br />&#110;&#111;&#32;&#112;&#117;&#114;&#112;&#111;&#115;&#101;&#44;&#32;&#110;&#111;&#32;&#113;&#117;&#97;&#114;&#114;&#121;<br />&#46;&#46;&#46;&#110;&#111;&#32;&#97;&#110;&#115;&#119;&#101;&#114;&#101;&#115;&#46;&#46;&#46;<br /><br />&#65;&#110;&#100;&#32;&#97;&#108;&#108;&#32;&#116;&#104;&#101;&#32;&#100;&#114;&#101;&#97;&#114;&#121;&#32;&#110;&#105;&#103;&#104;&#116;<br />&#116;&#104;&#97;&#116;&#32;&#104;&#97;&#100;&#32;&#98;&#101;&#102;&#97;&#108;&#108;&#101;&#110;&#32;&#97;&#99;&#114;&#111;&#115;&#115;<br />&#116;&#104;&#101;&#32;&#108;&#97;&#110;&#100;<br />&#73;&#32;&#115;&#108;&#105;&#112;&#112;&#101;&#100;&#32;&#105;&#110;&#116;&#111;&#32;&#97;&#32;&#114;&#101;&#118;&#101;&#114;&#121;<br />&#97;&#32;&#119;&#101;&#98;&#32;&#111;&#102;&#32;&#104;&#117;&#109;&#97;&#110;&#32;&#104;&#97;&#110;&#100;<br /><br />&#89;&#111;&#117;&#32;&#108;&#111;&#110;&#103;&#101;&#100;&#32;&#116;&#111;&#32;&#115;&#111;&#97;&#114;&#32;&#117;&#112;&#32;&#104;&#105;&#103;&#104;<br />&#116;&#111;&#32;&#99;&#97;&#114;&#101;&#115;&#115;&#32;&#116;&#104;&#101;&#32;&#115;&#105;&#108;&#107;&#121;&#32;&#119;&#105;&#110;&#100;&#115;<br />&#116;&#111;&#32;&#101;&#109;&#98;&#114;&#97;&#99;&#101;&#32;&#97;&#110;&#100;&#32;&#107;&#105;&#115;&#115;&#32;&#97;&#115;&#32;&#108;&#111;&#118;&#101;&#114;&#115;<br />&#46;&#46;&#46;&#116;&#104;&#101;&#32;&#101;&#116;&#104;&#101;&#114;&#46;&#46;&#46;<br /><br>" 
html.unescape(s) 
"<div class='lyricbox'>It was when I realized<br />that life has no meaning<br />no purpose, no quarry<br />...no answeres...<br /><br />And all the dreary night<br />that had befallen across<br />the land<br />I slipped into a revery<br />a web of human hand<br /><br />You longed to soar up high<br />to caress the silky winds<br />to embrace and kiss as lovers<br />...the ether...<br /><br>" 

Ein guter Parser darum kümmern, auch das minimalistische HTMLParser kümmert sich um diese.

+0

Vielen Dank! Es funktioniert jetzt – sorh

+0

@sorh welcher Parser du benutzt bdw? –

+0

Ich benutzte beautifulsoup mit lxml. Ich denke immer noch, dass ich ein paar Dinge vermasselt habe, wie Sie unter Tonys Antwort sehen können: – sorh