Probleme mit beautiful soup

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

Hallo zusammen,

ich verwende seit einiger Zeit beautiful soup um einige Infos aus dem Netz zu holen. Bisher hatte ich keine Probleme und bin mit der Verwendung gut klar gekommen. Seit einigen Tagen funktioniert aber einiges nicht mehr, ich vermute das die Website geändert wurde und ich weiß nicht, wie ich das Problem weiter eingrenzen kann:

Code: Alles auswählen

import mechanize, bs4

browser=mechanize.Browser()
browser.open('http://www.comdirect.de/inf/indizes/detail/chart.html?TIME_SPAN=1D&ID_NOTATION=20735')
test=browser.response().read()
soup = bs4.BeautifulSoup(test)
Wenn ich den Inhalt der Seite in Beautiful Soup einlesen will, dann crasht das Ganze:

Code: Alles auswählen

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/site-packages/bs4/__init__.py", line 172, in __init__
    self._feed()
  File "/usr/lib64/python2.7/site-packages/bs4/__init__.py", line 185, in _feed
    self.builder.feed(self.markup)
  File "/usr/lib64/python2.7/site-packages/bs4/builder/_lxml.py", line 195, in feed
    self.parser.close()
  File "parser.pxi", line 1187, in lxml.etree._FeedParser.close (src/lxml/lxml.etree.c:87912)
  File "parsertarget.pxi", line 130, in lxml.etree._TargetParserContext._handleParseResult (src/lxml/lxml.etree.c:97055)
  File "lxml.etree.pyx", line 294, in lxml.etree._ExceptionContext._raise_if_stored (src/lxml/lxml.etree.c:8862)
  File "saxparser.pxi", line 259, in lxml.etree._handleSaxData (src/lxml/lxml.etree.c:93200)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xfe in position 51: invalid start byte
Bei mir verwendet Beautiful Soup lxml als Parser. Die Seite ist laut Firefox in utf8 kodiert, also passt das. Irgendein Zeichen auf der Seite macht wohl seit einigen Tagen Probleme. Wie kann ich das Problem eingrenzen und lösen? Danke.

Edit: Das Ganze ist Python 2.7.3 unter Linux.
Grüße Basti
Zuletzt geändert von BastiL am Montag 31. Dezember 2012, 17:09, insgesamt 2-mal geändert.
BlackJack

@BastiL: Wenn ich mir die Seite mit `wget` herunterlade kommt da kein einziges Byte mit dem Wert 0xfe in den Daten vor.
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

BlackJack hat geschrieben:@BastiL: Wenn ich mir die Seite mit `wget` herunterlade kommt da kein einziges Byte mit dem Wert 0xfe in den Daten vor.
Mag sein, das hilft mir aber nicht weiter. Warum crasht mein Vierzeiler? Oder läuft er bei Dir?
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

So ich habe festgestellt, wenn man den Code von oben kopiert geht es, weil man auf der Fehlerseite der comdirect landet....
Die Python-Tags machen aus dem "&" in der URL ein "&" und damit ist die URL falsch. Bitte vor dem Ausführen die URL korrigieren:

http://www.comdirect.de/inf/indizes/det ... TION=20735

Danke.
BlackJack

@BastiL: Ich müsste erst BeautifulSoup 4 installieren bevor ich das ausprobieren kann. Und mein Beitrag hätte Dir insofern weiterhelfen können, dass Du mal bei Dir probierst wo der Unterschied zwischen `mechanize` und wget zustande kommt. Also einfach mal vergleichen.

Edit: Habe bs4 installiert: Dein Skript aus dem ersten Beitrag läuft ohne Ausnahme durch.
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

BlackJack hat geschrieben:@BastiL: Ich müsste erst BeautifulSoup 4 installieren bevor ich das ausprobieren kann. Und mein Beitrag hätte Dir insofern weiterhelfen können, dass Du mal bei Dir probierst wo der Unterschied zwischen `mechanize` und wget zustande kommt. Also einfach mal vergleichen.
Wie mache ich das? Hast du den Link aus meinem ursprünglichen Posting verwendet (damit funktioniert es bei mir) oder den korrigierten aus meinem dritten Post (anderes kaufmännisches UND). Der Link aus dem dritten Posting ist der richtige, und damit funktioniert bei mir nach wie vor nichts.
BlackJack hat geschrieben:Edit: Habe bs4 installiert: Dein Skript aus dem ersten Beitrag läuft ohne Ausnahme durch.
Auch hier die Frage: Welcher Link?
WIe kann ich übrigens einen Link mit kaufmännischem UND richtig innerhalb der Python-Tags eingeben? Danke.
BlackJack

@BastiL: Ich habe den richtigen Link verwendet.

Vergleichen: Webseite herunterladen, zum Beispiel mit wget oder Browser und mit `mechanize` und das in eine Datei schreiben. Dann die beiden Dateien byteweise vergleichen.

Der Syntax-Highlighter macht aus ``&`` leider grundsätzlich ``&``. Keine Ahung ob sich das leicht fixen lässt. Wäre das hier ein Forum für Sprachen wo ``&&`` statt ``and`` für die logische Verknüpfung verwendet würde, wäre der Leidensdruck etwas zu unternehmen sicher höher. :twisted:
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

BlackJack hat geschrieben:@BastiL: Ich habe den richtigen Link verwendet.
Ok. Bei mir funktioniert es mit dem richtigen Link Stand heute nicht ...
BlackJack hat geschrieben:Vergleichen: Webseite herunterladen, zum Beispiel mit wget oder Browser und mit `mechanize` und das in eine Datei schreiben. Dann die beiden Dateien byteweise vergleichen.
Ok wie ich die Seiten laden kann ist mir klar. Wie vergleiche ich die Dateien byteweise?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Zum beispiel mit ``diff`` oder ``xxd`` und dann ``diff``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@BastiL: In dem Du Dir die Bytewerte der beiden Dateien anschaust und die vergleichst. Einen ``diff`` von Hexdumps der beiden Dateien machen oder in Python schnell ein kleines Progrämmchen dafür zusammen hacken.

Vielleicht reicht es auch schon in das Ergebnis von `mechanize` rein zu schauen und nach dem Bytewert zu suchen über den `lxml` stolpert und der in der Seite normalerweise ja anscheinend gar nicht vorkommt.
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

So ich habe da wohl ein anderes Problem. Ich kann den Link per Firefox laden, aber per wget aus einer Linux-Konsole heraus geht es nicht ... (FEHLER 500: Internal Server Error). Auch ein ping auf die comidrect-Homepage geht nicht, auf andere Websites geht es.
Interessant in dem Zusammenhang ist auch, dass die condirect-Site vor einigen Tagen mal länger fast gar nicht (auch nicht per Firefox) erreichbar war. Ich werde vielleicht erst mal etwas abwarten, im Moment vermute ich das Problem eher auf deren Seite.
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

So ich habe die Dateien fertig. Das Problem mit wget waren fehlende Maskierungen der URL, jetzt geht es. Pingen kann ich http://www.comdirect.de trotzdem nicht....
Ich weiss nicht mehr weiter deshalb habe ich die beiden Dateien aus Python und wget hier hochgeladen. Der Unterschied scheint nur ein Zeilenumbruch am Dateiende zu sein. Trotzdem bekomme ich immer noch den unicode-Fehler beim Ausführen meines Vierzeilers. Vielleicht könnte sich jemand mal die Dateien anschauen. Danke.

Edit: Wo kann ich die Dateien laden? Hier scheint es nicht zu gehen.
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

Kann mir hier wirklich keiner sagen, wie ich hier die beiden Dateien hochladen kann?

Ich habe die Probleme immer noch und versuche jetzt herauszufinden, ob der Parser auch crasht, wenn ich statt des Downloads eine der beiden Dateien verwende.
lunar

BastiL hat geschrieben:Kann mir hier wirklich keiner sagen, wie ich hier die beiden Dateien hochladen kann?
Gar nicht. Was bringt Dich zur Annahme, Du könntest hier Dateien hochladen? Suche Dir einen Filehoster ohne Werbung und zig Popups, oder gebe die Datei aus Deiner Dropbox heraus frei.
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

Soory, ich habe einfach angenommen, dass man eine Datei hochladen kann.

Ich habe das Problem jetzt gelöst, indem ich statt dem ixml den Standard Python-html-Parser als Parser für bs4 verwende. Dann funktionert alles wieder so wie bis vor ein paar Tagen auch mit lxml, warum auch immer.
Antworten