listen mit for schleife erzeugen

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
ren22
User
Beiträge: 9
Registriert: Mittwoch 20. Oktober 2010, 21:13

hallo :D

ich komme mal wieder seit 2oder3 wochen nicht weiter mit einem kleinem problem, das es automatisch listen erzeugt.
hier mal mein kleiner code

Code: Alles auswählen

import urllib, string
import re

url = "http://soundcloud.com/search?q[fulltext]=minimal"

response = urllib.urlopen(url)
i = 0
for line in response.readlines():
    if re.search('<li class="player">', line):
        i = i + 1
        print "match start!"
    if re.search('<span class="content-size">(.*)</span>', line):
        p = re.compile('<span class="content-size">(.*)</span>')
        link_size = p.findall(line)
        liste.append(link_size)
        print link_size
        print "match!"
    if re.search('<a class="comments-toggle" href="#no-comments" title="Hide the comments">Hide the comments</a>', line):
        print "match ende!"

print liste
and der stelle "liste.append(link_size)" sollte eigentlich pro durchgang eine neue liste erzeugt werden wo dann die werte jedes schleifen duchlauf reingeschrieben wird.

ich habe schon alles mögliche probiert aber ich bekomme es einfach nicht hin .

vielleich kann mir ja einer wieder von euch helfen :P

danke
gruss ren22
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

ren22 hat geschrieben:ich habe schon alles mögliche probiert aber ich bekomme es einfach nicht hin .
Wenn du DAS nicht hinbekommst und dafür 2-3 Wochen probieren musst, dann ist es höchste Zeit für die Lektüre eines Tutorials (dafür hätten die 2-3 Wochen auch gereicht). Das sind Basics!
Und: Eine Liste nennt man nicht "liste". Und: Wo wird diese Liste überhaupt definiert?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Zum HTML parsen solltest du am besten eine geeignete Library dafür verwenden, z.B. `lxml` (http://codespeak.net/lxml/)

Wenn du bei jedem Durchlauf eine neue Liste haben willst, musst du eben eine neue Liste erzeugen. Und diese eben in eine weitere Liste stecken. Also eine Liste von Listen erzeugen.
Entweder dir fehlen die wichtigsten dazu Grundlagen (-> dann Tutorial durcharbeiten) oder mir ist dein Problem nicht wirklich klar, dann genauer beschreiben.

Achja, es gibt auch Code-Tags für python, dann wird das schön formatiert.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
ren22
User
Beiträge: 9
Registriert: Mittwoch 20. Oktober 2010, 21:13

hallo

ich habe es jetzt "anders" gelöst ...soweit erstmal

Code: Alles auswählen

import urllib, string
import re

url = "http://soundcloud.com/search?q[fulltext]=minimal"

response = urllib.urlopen(url)
i = 0
liste = []
link_size = ''
for line in response.readlines():
    if re.search('<li class="player">', line):
        i = i + 1
        link_size = ''
        print "match start!"
    if re.search('<span class="content-size">(.*)</span>', line):
        p = re.compile('<span class="content-size">(.*)</span>')
        link_size = p.findall(line)
        liste.extend(link_size)
        print link_size
        print "match!"
    if re.search('<a class="comments-toggle" href="#no-comments" title="Hide the comments">Hide the comments</a>', line):
        if link_size == '':
            print link_size
            print "linksize none"
            link_size = 'k.a. MB'
            liste.append(link_size)
        print "match ende!"
        print i
print i
print liste
ausgabe:
match start!

linksize none
match ende!
1
match start!
['8.63 MB']
match!
match ende!
2
match start!

linksize none
match ende!
3
match start!

linksize none
match ende!
4
match start!

linksize none
match ende!
5
match start!
['12.31 MB']
match!
match ende!
6
match start!

linksize none
match ende!
7
match start!

linksize none
match ende!
8
match start!

linksize none
match ende!
9
match start!

linksize none
match ende!
10
10
['k.a. MB', '8.63 MB', 'k.a. MB', 'k.a. MB', 'k.a. MB', '12.31 MB', 'k.a. MB', 'k.a. MB', 'k.a. MB', 'k.a. MB']
das eigentliche problem ist, dass man bei listen nicht wie bei variablen einfach eine zäzhler variable an die variable anhängen kann

Code: Alles auswählen

a = 0
for i in range(3):
    a += 1
    print ['test'+str(a)]
also nach diesem beispiel: liste(a)
was aber nicht geht weil die zähler variable bei einer liste ja das listenelemnt anspricht ...

anderes bsp:
liste = [1, 2, 3]

angenommen a = 1

liste[a]

das gibt dann 2 aus

weil liste[1] ist ja 2

das ist es eigentlich was ich suche , ich hoffe ich habe jetzt nicht alles durch einander geworfen (sicherlich)
['test'+str(a)] angenommen test = liste und str(a) wäre dann der erhöher ...
um somit dann liste1 , liste2, liste3 usw zu bekommen.

gruss ren22
BlackJack

@ren22: Du willst wirklich dringend mal das Tutorial in der Python-Dokumentation durcharbeiten und die Grunddatentypen von Python kennenlernen. Also zum Beispiel Dictionaries. Oder vielleicht auch einfach eine verschachtelte Liste verwenden.

Edit: Und bitte ziehe einen HTML-Parser in Betracht. Reguläre Ausdrücke auf Zeilen angewandt ist umständlich und fehleranfällig. Mit `lxml.html` kommt man zum Beispiel viel einfacher auf das gleiche Ergebnis (das Ergebnis der Suchanfrage habe ich in `test.html` gespeichert um beim Testen nicht immer das selbe runter zu laden):

Code: Alles auswählen

from lxml import html


def main():
    with open('test.html') as html_file:
        doc = html.fromstring(html_file.read())
        player_nodes = doc.xpath('//li[@class="player"]')
        result = list()
        for player_node in player_nodes:
            size_nodes = player_node.xpath('.//span[@class="content-size"]')
            result.append(size_nodes[0].text if size_nodes else 'k.A.')
        print result


if __name__ == '__main__':
    main()
Ausgabe: ['k.A.', '8.63 MB', 'k.A.', 'k.A.', 'k.A.', '12.31 MB', 'k.A.', 'k.A.', 'k.A.', 'k.A.']

Ich denke Du wirst ja nicht nur auf die Grösse zugreifen wollen, sondern auch auf andere Daten von einem Stück, da würde das mit den `re`\s noch unübersichtlicher. Bei einem HTML-Parser der das Dokument als Baumstruktur repräsentiert, kann man das Problem viel einfacher in kleinere Unterprobleme zerlegen.
ren22
User
Beiträge: 9
Registriert: Mittwoch 20. Oktober 2010, 21:13

vielen dank an alle und an BlackJack dank dir hab ich jetzt das parsen mit lxml ein wenig mehr verstandenzumindestens :P
jetzt kann mich ein wenig an dem "example" hochhangeln und verstehen was was ist :D trail and error like

html links aus tags auslesen :P

Code: Alles auswählen

from lxml import html
from lxml.html import parse


def main():
    with open('test.html') as html_file:
        doc = html.fromstring(html_file.read())
        player_nodes = doc.xpath('//li[@class="player"]')
        result = list()
        
        #hier die links
        for player_node in player_nodes:
            size_nodes = player_node.xpath('.//a[@class="download pl-button"]')
            for b in size_nodes:
                base_link = b.get('href')
                #print base_link
            result.append(base_link if size_nodes else 'k.A.')
        
         print result


if __name__ == '__main__':
    main()

kann man echt ne menge mit lxml und besonders python machen :D
^^ python rocks :P

gruss ren22
Antworten