Problem mit Regular Expression

  • Guten Tag meine XBMC Nerds,
    ich versuche momentan mein erstes "richtiges" eigene Addon für XBMC zu erstellen und habe da momentan folgendes Problem:

    Ich habe eine XML die ich von einer Webseite auslesen möchte welche wie Folgt aufgebaut ist:
    Print Link per Python Shell:

    Normalerweise werden die Daten die ich auselesen möchte z.B. bei einer html Datei nicht mehrzeilig sondern in einer Zeile ausgeben und ich würde sie wie folgt in meinem xbmc addon schreiben:

    Beispiel:

    Code
    <li id="menu-item-28120" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-28120"><a href="http://pure-anime.biz/index.php/faq">FAQ</a></li>

    Würde bei mir dann so aussehen:

    Code
    match=re.compile('<li id=".+?"><a href="(.+?)">(.+?)</a></li>').findall(link)
    for url,name in match: addLink(name,url,'')

    Nun meine Frage wie kann ich jetzt bei meinem "match=re.compile" alle Zeilen der XML Datei auslesen bzw. den Part den ich benötige?

    Ich benötige in diesem Beispiel den title,creatore,image

    Ich habe es test halber mal so versucht:


    req = urllib2.Request(url)
    req.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3')
    response = urllib2.urlopen(req)
    link=response.read()
    response.close()
    gettitle=re.compile('<title>(.+?)</title>').findall(link)
    getmp3=re.compile('<location>(.+?)</location>').findall(link)
    getartist=re.compile('<creator>(.+?)</creator>').findall(link)
    addDir(getartist + ' - ' + gettitle, getmp3, 2,'')


    Dies gab mir jedoch nur Fehlermeldungen raus:


    EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
    - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
    Error Type: <type 'exceptions.TypeError'>
    Error Contents: can only concatenate list (not "str") to list
    Traceback (most recent call last):
    File "C:\Users\PayCay\AppData\Roaming\XBMC\addons\BEISPIEL\default.py", line 98, in <module>
    INDEX(url)
    File "C:\Users\PayCay\AppData\Roaming\XBMC\addons\BEISPIEL\default.py", line 18, in INDEX
    addDir(gettitle + ' - ' + getartist,getmp3,2,'')
    TypeError: can only concatenate list (not "str") to list
    -->End of Python script error report<--
    17:19:27 T:5624 ERROR: XFILE::CDirectory::GetDirectory - Error getting plugin://BEISPIEL/?mode=1&name=Test&url=http://www.BEISPIEL.de/index.php?templist=2&c=&file=578301.xml
    17:19:27 T:5624 ERROR: CGUIMediaWindow::GetDirectory(plugin://BEISPIEL/?mode=1&name=Test&url=http://www.BEISPIEL.de/index.php?templist=2&c=&file=578301.xml) failed

    Es sei denn ich sage bei AddDir das er den ersten "Treffer" nehmen soll

    Code
    addDir(getartist[0] + ' - ' + gettitle[0], getmp3[0], 3,'')

    Aber da die Tracklist von XML zu XML variiert können es mehrere "Treffer" sein.


    Ich hoffe ich konnte halbwegs es verständlich ausdrücken.

    Sorry konnte die letzten beiden Sachen nicht als Quellcode einzeigen, weil er dann einfach alles nebeneinander listet.

  • Error Type: <type 'exceptions.TypeError'>
    Error Contents: can only concatenate list (not "str") to list

    Sieht aus als ob er eine Liste erwarten würde du ihm aber einen Str (=String?) als argument übergibst.
    Typecast error.

    Aber bin kein python guru....

    with great power comes great electricity bill!

  • Hi,

    mf-3hd hat im Prinzip schon Recht, er erwartet in diesem Fall eine Liste (und kein String) - das aber nur weil der erste Typ bereits eine Liste war!
    Du möchtest aber einen String haben, also ist die erste Liste bereits falsch.

    Ich könnte dir jetzt die Lösung einfach verraten, denke aber, dass dir mehr geholfen ist wenn du dir selber helfen kannst ;)

    Für solche Fälle ist es erst mal ratsam sich alle beteiligten Objekte (Ja, strings, listen etc. sind Objekte in python) per "repr()" anzuschauen.
    Die Fehlerwerfende Zeile lautet

    Code
    addDir(gettitle + ' - ' + getartist,getmp3,2,'')


    Mach davor mal z.B. folgendes:

    Code
    print repr(gettitle)


    Und du wirst nicht nur sehen was für ein Typ "gettitle" enthält, sondern auch welche(n) Wert(e).

    Außerdem, wenn du bei Regulären Ausdrücken bleiben willst schau dir mal das Flag "re.DOTALL" an.
    Abgesehen davon würde ich persönlich aber auch stattdessen HTML/XML parsende Libraries bevorzugen, z.B: ElementTree oder BeautifulSoup...

    Viel Erfolg!

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!