mechanize sonderzeichen problem

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
taake
User
Beiträge: 125
Registriert: Donnerstag 14. Oktober 2010, 08:49

Moin,

ich hab hier ein Problem und weiß nicht mehr wirklich weiter.

Allem anschein nach liegt es nach an den bescheidenen erstellern der website:

Mal etwas output

Code: Alles auswählen

#!/usr/bin/python2.7

# -*- coding: utf-8 -*-

import mechanize
import cookielib
url = "http://some.url"
br = mechanize.Browser()

cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)

br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=10)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:6.0) Gecko/20100101 Firefox/6.0')]

br.add_password( url, "user", "pass" )
response = br.open( url )
print response.read()
Ergibt folgenden Output:

Code: Alles auswählen

[...]
<meta name="description" content="CYBERSHOP ist die benutzerfreundliche, individuelle und flexible Mietlösung für Internet-Shops. Vom fertigen Modul.Shop bis zum individuellen Shopping-Portal entwickeln wir maÃUSER@MACHINE
Dass das user@machine (unix shell) direkt nach dem output kommt ist schon mal mehr als verdächtig.

Der gesammte output der description ist:

Code: Alles auswählen

<meta name="description" content="CYBERSHOP ist die benutzerfreundliche, individuelle und flexible Mietlösung für Internet-Shops. Vom fertigen Modul.Shop bis zum individuellen Shopping-Portal entwickeln wir maßgeschneiderte Lösungen für Ihren Online-Shop.">
Daher habe ich die starke Vermutung das python hier übers encoding stolpert, aus dem grund hab ich schon das

Code: Alles auswählen

# -*- coding: utf-8 -*-
mit ins script eingebaut, leider ohne wirkung.

Jetzt zur eigentlichen Frage, wie schaffe ich es das python bzw. mechanize nicht über das dreckige encoding der page stolpert?
deets

Du verraetst uns ja die URL nicht, so das man nicht ueberpruefen kann, ob die Ersteller der Seite wirklich das Problem haben, oder ob das nicht viel eher auf deiner Seite liegt.

Das du allerdings versuchst, das encoding-cookie im Skript zu setzen um dein Problem zu loesen, das sich AUSSSCHLIESSLICH auf unicode-Literale im Quellcode, also alles was mit u" anfaengt, bzw. in Python 3 'normale' Strings, und NICHT UND NIEMALS auf Ein/Ausgaben deines Skriptes ueber Dateine, Netzwerke oder sonstewas auswirkt, vermute ich mal die Bescheidenheit auf deiner Seite...

Die Loesung sieht dementsprechend so aus, dass du die gelesenen Daten gemaess ihrem encoding erstmal dekodieren musst (es scheint sich um UTF-8 zu handeln), um sie dann in dem gewunschten Ausgabe-Encoding zB deiner Shell zu enkodieren. Welches wiederum nach latin1 oder cp1252 ausieht, da es offensichtlich Umlaute in UTF-8 in zwei Zeichen darstellt.

Es gibt verschiedene Moeglichkeiten, wie eine Seite das encoding setzten kann - meta-tags und content-type - musst du rausfinden, wie die geheimnisvolle Seite das macht.
taake
User
Beiträge: 125
Registriert: Donnerstag 14. Oktober 2010, 08:49

Danke für diese halbwegs hilfreiche antwort...

Die Seite bringt dir nichts da du nur nen 401 als antwort bekommen würdest ...

Code: Alles auswählen

br.add_password( url, "user", "pass" )
Und die Daten kann ich dir beim besten willen nicht zur Verfügung stellen.


Die Website setzt leider kein encoding ...

http header mitschnitt:

Code: Alles auswählen

HTTP/1.1 200 OK
Date: Tue, 28 Aug 2012 14:52:48 GMT
Server: Apache
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-cache, must-revalidate
Pragma: no-cache
Last-Modified: Tue, 28 Aug 2012 14:52:48 GMT
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html

Code: Alles auswählen


<html>
<head>

<title>REDAKTION</title>
<meta http-equiv="expires" content="Tue, Nov 21 2000 05:00:00 GMT"> 
<meta http-equiv=cache-control content=no-cache>
<meta http-equiv=pragma content=no-cache>
<meta name="description" content="CYBERSHOP ist die benutzerfreundliche, individuelle und flexible Mietlösung für Internet-Shops. Vom fertigen Modul.Shop bis zum individuellen Shopping-Portal entwickeln wir maßgeschneiderte Lösungen für Ihren Online-Shop.">
<meta name="keywords" content="Cybershop Cybershops Cyber-Shop Cyber-Shops Mietshops Mietshop Mietshopsysteme Mietshop-Systeme Anbieter Online-Shop Onlineshop Internet-Shop Internetshop Onlinestore Online-Store Mietlösung Webshop Web-Shop Webshops Web-Shops Internetkaufhaus Internet-Kaufhaus">
<meta name="robots" content="INDEX, FOLLOW, ALL">
<meta name="revisit-after" content="30 days">
<meta name="language" content="de, ch, au, nl">
<meta name="dc.creator" content="www.cybershop.de">
<meta name="dc.publisher" content="www.cybershop.de">
<meta name="author" content="www.cybershop.de">
<link rel="stylesheet" href="style.css" type="text/css">

<script language="JavaScript">
function ReloadSite()
{
}
// popitup Hilfe
function popituphelp(destination)
{ 
PopWin=window.open (destination,'CYBERSHOP_HELP','width=700,height=700,resizable=yes,scrollbars=yes,toolbar=yes,status=no,directories=no,menubar=no,location=help');
PopWin.focus();
}
function popitupauktion(destination)
{ 
PopWin=window.open (destination,'Auktionsansicht','width=1000,height=700,resizable=yes,scrollbars=1,toolbar=yes,status=yes,directories=yes,menubar=yes,location=help');
PopWin.focus();
}
// popitup Artikel
function popitupArtikel(destination)
{ 
PopWin=window.open (destination,'CYBERSHOP_ARTIKEL','width=800,height=600,resizable=yes,scrollbars=yes,toolbar=no,status=no,directories=no,menubar=no,location=help');
PopWin.focus();
}
function popitupDaten(destination)
{ 
PopWin=window.open (destination,'CYBERSHOP_DATEN','width=800,height=600,resizable=yes,scrollbars=yes,toolbar=yes,status=yes,directories=yes,menubar=yes,location=help');
PopWin.focus();
}
function default_validate_bestell(){
Check = confirm("Wollen Sie die Einstellungen wirklich zuruecksetzen?");
if(Check == true) window.bestmaildefault.submit();
}
function default_validate_bestellshop(){
Check = confirm("Wollen Sie die Einstellungen wirklich zuruecksetzen?");
if(Check == true) window.bestmaildefaultm.submit();
}
</script>
</head>
deets

Aendert nix an meiner Antwort, das Problem ist immer noch, dass du die Daten nicht transkodierst, und das encoding-cookie deines Python-Skriptes dafuer so relevant ist wie die relative Mondfeuchte.

Und wie ich in meiner halbwegs hilfreichen Antwort auch schon erwaehnt habe: das verwandte Encoding der Seite ist klar UTF-8.
Antworten