Anfängerfrage zu re.compile

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.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

Also Ich kann beim besten willen keinen unterschied feststellen außer den von mir genannten....

Ich habe noch einmal eine andere Frage...

und Zwar werden einige Sendernamen wie folgt angegeben...

AXN (Pay-TV)
Channel :ATV (Österreich)

damit ich die Kanäle mit meiner Datenbank abgleichen kann müssen die zusätze (Pay-TV) oder (Österreich) entfernt werden...
das ist eigendlich kein problem

Code: Alles auswählen

channel = re.compile('"stationslogo" alt="(.+?)"', re.DOTALL).findall(entry)[0]
channel = channel_raw.replace(' (Pay-TV)','').strip()
bei Österreich klappt das nicht, da kommt eine Fehlermeldung:
SyntaxError: Non-ASCII character '\xc3' in file G:\Test1.py on line 67, but no encoding declared;
Das sliegt ja daran, dass das "Channel" ascii kodiert ist aber meine versuche mit

Code: Alles auswählen

channel = channel.encode('utf-8')
bringen keine Abhilfe
BlackJack

@sveni_lee: Es muss ja irgendeinen Grund geben. Aber solange Du das Problem nicht nachvollziehbar zeigen kannst, kann man da halt nicht viel zu sagen.

Jetzt fängst Du ja schon wieder mit regulären Ausdrücken an… :roll:

Die Fehlermeldung bezieht sich auf Deinen Quelltext und hat nichts mit den Daten zu tun. Ausserdem ist das nicht die ganze Fehlermeldung. Lies die mal komplett und folge dem Link.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

ja, ich weiß... ist nicht schön bringt mir aber grad das bessere Ergebnis, da ich den "Fehler" nicht finden kann...

dem link bin gefolgt aber werde nicht wirklich schlau daraus...

da

Code: Alles auswählen

# -*- coding: utf-8 -*-
ja nicht unterstützt wird

und ein *.encode('utf-8') auch nicht funktioniert
Benutzeravatar
pillmuncher
User
Beiträge: 1488
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@sveni_lee: # -*- config: utf-8 funktioniert dann und nur dann, wenn die Datei, in der das steht, auch wirklich utf-8 kodiert ist. Dazu musst du deinen Editor entsprechend konfigurieren. Eine Datei, die, sagen wir in cp850 kodiert ist, wird nicht magisch zu einer in utf-8 kodierten Datei, bloß weil man das da reinschreibt.
In specifications, Murphy's Law supersedes Ohm's.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

@pillmuncher:

also Ich nutze SubLime Text 3

in meiner python.sublime-build steht folgendes:

Code: Alles auswählen

{
    "cmd": ["g:\\Python\\python.exe", "-u", "$file"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.python"
}
und wenn in der Konsole kommt folgendes

Code: Alles auswählen

c:\>chcp
Active Codepage: 850
also nicht uft-8

Nur wie kann ich das umstellen?

in sublime sollte es so gehen

Code: Alles auswählen

{
    "cmd": ["g:\\Python\\python.exe", "-u", "$file"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.python"
    "encoding": "uft-8"
}
reicht das schon?
Benutzeravatar
pillmuncher
User
Beiträge: 1488
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

sveni_lee hat geschrieben:

Code: Alles auswählen

{
    "cmd": ["g:\\Python\\python.exe", "-u", "$file"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.python"
    "encoding": "uft-8"
}
reicht das schon?
Mit SublimeText kenne ich mich nicht aus, aber wenn, dann muss es utf-8 heißen, nicht uft-8.

Außerdem: selbst, wenn du die Datein dann mit SublimeText öffnest, ist sie immer noch in cp850 kodiert. Du musst vermutlich eine neue - leere - Datei erstellen, den Inhald der ursprünglichen Datei kopieren, in die neue Datei einfügen und unter dem richtigen Namen speichern. Am besten machst du auch ein Backup der alten Datei.
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

@sveni_lee: Das hat nichts mit den Sublime-Einstellungen zu tun die Du da zeigst. Die Kodierung die in dem Kommentar angegeben wird, muss halt mit der Kodierung übereinstimmen in der die Datei abgespeichert wird. Das wiederum hat nichts mit der Kodierung zu tun die in einer Konsole verwendet wird. Du musst halt mal schauen wo Dir der Editor anzeigt welche Kodierung er für die Datei verwendet.

Edit: http://stackoverflow.com/a/20657899/3815611
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

hat leider nicht funktioniert...

aber trotzdem Danke...
BlackJack

@sveni_lee: Was hat nicht funktioniert? Es richtig zu machen? Doch, wenn man es richtig macht, dann funktioniert es auch. :-)
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

@BlackJack: sorry, Ich hatte deine Antwort und den Link nicht gesehen... Danke dafür.
In der Status zeile wird jetzt auch UTF-8 angezeigt. aber der Fehler bleibt.

folgendes:

ohne

Code: Alles auswählen

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

Code: Alles auswählen

SyntaxError: Non-ASCII character '\xc3' in file G:\Test1.py on line 68, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
mit

Code: Alles auswählen

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

Code: Alles auswählen

Traceback (most recent call last):
  File "G:\Test1.py", line 111, in <module>
    get_SerienSendetermine()		
  File "G:\Test1.py", line 68, in get_SerienSendetermine
    channel = channel.replace(' (Östrreich)','').strip()
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2: ordinal not in range(128)
BlackJack

@sveni_lee: Das eine hat nichts mit dem anderen zu tun. Beim `SyntaxError` konnte der Compiler nichts mit dem Ö anfangen. Beim zweiten Fehler mischst Du Bytestrings und Unicode, was dazu führt das Python versucht implizit den Bytestring als ASCII zu dekodieren. Der ist aber kein ASCII, darum geht das nicht. Verwende ein Unicode-Zeichenliteral, also ein u vor der Zeichenkette: u' (Östrreich)'
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

ahhh...

okay, jetzt habe ich das verstanden...

klappt wunderbar - Danke...!
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

hier hat nicht zufällig jemand Ahnung von JSON RPC abfragen?

Ich versuche grad den Namen zu der imdbnumber aus meiner Kodi-Datenbank aufzulösen.
bekomme aber immer nur 0 angezeigt... Also denke ich das da noch irgendwo ein Fehler sein muss...

Code: Alles auswählen

def TVShowName2TVShowID(tvshowname):
    query = {
           "jsonrpc": "2.0",
           "method": "VideoLibrary.GetTVShowDetails",
            "params": {"limits": {"start": 0, "end": 200}},
            "id": 1
            }
    res = json.loads(xbmc.executeJSONRPC(json.dumps(query, encoding='utf-8')))
  
    if 'result' in res and 'tvshow' in res['result']:
        res = res['result'].get('tvshow')
        for tvshow in res:
            if tvshowname.lower () in tvshow['sorttitle'].lower():
                debug("SerienPlaner found  imdb-ID %s" % (tvshow['sorttitle']))
                return tvshow['imdbnumber']
    return 0
Benutzeravatar
miracle173
User
Beiträge: 127
Registriert: Samstag 6. Februar 2016, 00:28

sveni_lee hat geschrieben:hier hat nicht zufällig jemand Ahnung von JSON RPC abfragen?
(...)
Das ist jetz eigentlich wieder eine eigenständige Frage und gehört nicht mehr zu 'Anfängerfrage zu re.compile'
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

Dake, neuen Tread erstellt...
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

@BackJack:

irgendwie finde ich BeautifulSoup sehr interessant... und für meine "nächsten" Versuch bestens geeignet...

ich habe eine xml-"Seite" die mir die gewünschen Informationen zur verfügung stellt.
jetzt möchte ich diese xml-"Seite" auswerten...

bsp: http://thetvdb.com/api/DECE3B6B5464C552 ... all/de.xml

hier sind alle informationen zu einer Serie abgelegt.
ich habe folgende Werte:
<EpisodeNumber> und <SeasonNumber> damit lässt sich die Episode eindeutig identifizieren

Ich würde das jetzt so machen...

Code: Alles auswählen

def get_desc_thetvdb():
	url="http://thetvdb.com/api/DECE3B6B5464C552/series/"+imdbnumber+"/all/de.xml"
    soup = BeautifulSoup(url)
	content = soup.find('Episode')
	result = {
		'season_tvdb': parse_number(node.find('SeasonNumber')),
		'episode_tvdb': parse_number(node.find('EpisodeNumber')),
		'episode_title_tvdb': node.find('EpisodeName)',
		'desc_db': node.find('Overview').text,
		'episodeid_tvdb': parse_number(node.find('id')),
	}
	return result
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

so, ich habe jetzt alle Einzelteile zusammen und versuche grad daraus ein plugin/script zumachen.

jetzt habe ich folgenden Fehler:

Code: Alles auswählen

 File "G:\KODI-Krypton\portable_data\addons\plugin.program.serienplaner\default.py", line 82, in getUnicodePage
 req = urllib2.urlopen(url, None, headers)
die entsprechende code Passage:

Code: Alles auswählen

def getUnicodePage(url, container=None):
    try:
        headers = { 'User-Agent' : 'Mozilla/5.0' }
        req = urllib2.urlopen(url, None, headers)
    except UnicodeDecodeError:
        req = urllib2.urlopen(url)
    encoding = 'utf-8'
    if "content-type" in req.headers and "charset=" in req.headers['content-type']:
        encoding=req.headers['content-type'].split('charset=')[-1]
    content = unicode(req.read(), encoding).replace("\\", "")
    if container is None: return content
    return content.split(container)
Sirius3
User
Beiträge: 17830
Registriert: Sonntag 21. Oktober 2012, 17:20

@sveni_lee: Und welchen Fehler bekommst Du?

Bevor Du jetzt anfängst Teile von requests nachzuprogrammieren, nochmals die Empfehlung gleich requests zu benutzen.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

okay, das erste Problem konnte ich lösen...

Code: Alles auswählen

def getUnicodePage(url, container=None):
    try:
        headers = { 'User-Agent' : 'Mozilla/5.0' }
        req = urllib2.Request(url, None, headers)
    except UnicodeDecodeError:
        req = urllib2.urlopen(url)

    encoding = 'utf-8'
    if "content-type" in req.headers and "charset=" in req.headers['content-type']:
        encoding=req.headers['content-type'].split('charset=')[-1]
    content = unicode(urllib2.urlopen(req).read(), encoding).replace("\\", "")
    if container is None: return content
    return content.split(container)
liefert mir nun das gewünschte Ergebnis...

nun habe ich die einzelnen scraper ausgelagert....

der scraper, der mir detailURL liefert

Code: Alles auswählen

_detailurl = re.compile('&nbsp;<a href="(.+?)" class', re.DOTALL).findall(content)
self.detailURL = "http://www.wunschliste.de"+_detailurl[0]
wenn ich nun die detailURL scrapen möchte

Code: Alles auswählen

details = WLScraper()
details.scrapeDetailPage(getUnicodePage(data.detailURL), 'div class="text"')
kommt immer eine Fehlermeldung:

Code: Alles auswählen

 Error Contents: unknown url type: 
 Traceback (most recent call last):
 File "G:\KODI-Krypton\portable_data\addons\plugin.program.serienplaner\default.py", line 474, in <module>
 scrapeWLPage(category)
 File "G:\KODI-Krypton\portable_data\addons\plugin.program.serienplaner\default.py", line 401, in scrapeWLPage
 details.scrapeDetailPage(getUnicodePage(data.detailURL), 'div class="text"')
 File "G:\KODI-Krypton\portable_data\addons\plugin.program.serienplaner\default.py", line 89, in getUnicodePage
 content = unicode(urllib2.urlopen(req).read(), encoding).replace("\\", "")
Antworten