Seite 1 von 1

Bestimmten Text auslesen

Verfasst: Freitag 13. März 2015, 20:18
von ulli82
Hallo.
Ich komm mal wieder nicht weiter :K

Ich möchte von einer Seite die maximale Seitenzahl auslesen.
<div class="page-container">
<ul class="page">
<li class="active"><span>1</span></li>
<li class=""><a href="/urlpage=2">2</a></li>
<li class=""><a href="/urlpage=3">3</a></li>
<li class=""><a href="/urlpage=4">4</a></li>
<li class=""><a href="/urlpage=5">5</a></li>
<li class=""><a href="/urlpage=6">6</a></li>
<li class="disabled"><span>...</span></li>
<li class=""><a href="/urlpage=33">33</a></li>
<li class=""><a href="/urlpage=2">weiter</a></li
></ul></div></div>
heißt ich möchte in diesem Fall als Ergebnis einfach nur 33.

Code: Alles auswählen

        soup = BeautifulSoup(htmltext)
        divs = soup.find_all('div', {'class' : 'page-container'})
        for a in divs:
            links = a.find_all('a')
            for link in links:
                if link.parent.name == 'li':
                    anzahl = (link.text) 
                    print anzahl
Ergebnis:
2
3
4
5
6
33
weiter

jemand ne Idee wie ich nur die 33 ausgegeben bekomme?
Die Anzahl ändert sich jedesmal.

Re: Bestimmten Text auslesen

Verfasst: Freitag 13. März 2015, 20:49
von BlackJack
@ulli82: Da könnte man alles mögliche machen. Nur die Zahlen filtern und die höchste nehmen. Oder immer den vorletzten Link verwenden falls es immer ein 'weiter' gibt.

Re: Bestimmten Text auslesen

Verfasst: Freitag 13. März 2015, 21:14
von ulli82
Mit dem vorletzen Link hab ich schon hinbekomen, nur gibts nicht immer ein weiter, wenn die Seitenzahl unter 5 ist.

Zahlen filtern und die höchste nehmen hab ich mir auch gedacht, bekomm ich nur leider nicht hin.

Re: Bestimmten Text auslesen

Verfasst: Freitag 13. März 2015, 21:47
von pixewakb
Pack die Werte in eine Liste und dann max(Liste), liefert den höchsten Wert. Du könntest auch eine Variable für einen Integer nehmen und prüfen, ob der neue Wert größer ist, dann Wert zuweisen, sonst nicht (pass). Brauchst du Beispielquellcode!? (Ich arbeite noch nicht mit der Bibliothek...)

Re: Bestimmten Text auslesen

Verfasst: Samstag 14. März 2015, 00:44
von ulli82
pixewakb hat geschrieben:Pack die Werte in eine Liste und dann max(Liste), liefert den höchsten Wert.
Wie gesagt, die Idee hatte ich auch schon, ich weiß nur nicht wie...

Re: Bestimmten Text auslesen

Verfasst: Samstag 14. März 2015, 01:02
von pillmuncher
Man kommt leicht drauf, wenn man das Tutorial durchgearbeitet hat:

Code: Alles auswählen

soup = BeautifulSoup(htmltext)
divs = soup.find_all('div', {'class' : 'page-container'})
nums = []
for div in divs:
    links = div.find_all('a')
    for link in links:
        if link.parent.name == 'li':
            try:
                num = int(link.text)
            except ValueError:
                pass
            else:
                nums.append(num)
max_num = max(nums)
(ungetestet)
Hast du das Tutorial durchgearbeitet?

Re: Bestimmten Text auslesen

Verfasst: Samstag 14. März 2015, 01:28
von ulli82
Vielen Dank, das funktioniert.

Durchgearbeitet... naja, teilweise.
Ich lese zwar immer mal wieder darin, aber für jemanden mit 0 programmier Kentnissen ist das doch ziemlich viel content, zumal auch noch alles auf Englisch ist...
Habe mich dann für die learning by doing Methode entschieden, aber das ist auch nicht viel besser :D

Re: Bestimmten Text auslesen

Verfasst: Samstag 14. März 2015, 08:37
von EyDu
Es gibt das Tutorial auch als deutsche Übersetzung, falls du mit der englischen Version nicht zurechtkommst. Das solltest du auf jeden Fall gründlich durcharbeiten, egal wie schwer es dir fällt. Mit Rumprobieren wirst du nicht weit kommen, da dir dann die elementarsten Grundlagen fehlen.

Re: Bestimmten Text auslesen

Verfasst: Samstag 14. März 2015, 18:22
von ulli82
Ich bin schon wieder den ganzen Tag am lesen und rumprobieren, aber ich komme schon wieder nicht weiter.
Dank pillmuncher habe ich es jetzt ja geschafft die max. Seitenanzahl auszulesen.
Diesen Wert möchte ich jetzt für die nächste Funktion verwenden.
Heißt:
url wird geöffnet, Seitenzahl wird ausgelesen.
Anschließen soll die gleiche url nochmal geöffnet und Links ausgelesen werden.
Dann wird die gleiche url nochmal geöffnet, bloß mit einem &page= dahinter. Das soll so oft passieren, bis die max. Seitenzahl erreicht ist (&page=33).
Habe ich soweit auch alles hinbekommen, die Seiten werden nacheinander geöffnet und alle links werden auch ausgelesen. Nur python stoppt nicht nach der letzten Seite. Es läuft immer weiter, macht aber nichts mehr.

Code: Alles auswählen

input_file = "input.txt"
urlout = "output.txt"

sfile = open(input_file)
slist = sfile.read()
urllist = slist.split("\n")
def seitenanzahl_auslesen():
    z=0
    while z< len(urllist):
        index_url = urllist[z]
        htmlfile = urllib.urlopen(index_url)
        htmltext = htmlfile.read()
        soup = BeautifulSoup(htmltext)
        divs = soup.find_all('div', {'class' : 'page-container'})
        if divs:
            nums = []
            for div in divs:
                links = div.find_all('a')
                for link in links:
                    if link.parent.name == 'li':
                        try:
                            num = int(link.text)
                        except ValueError:
                            pass
                        else:
                            nums.append(num)
            max_num = max(nums)            
        else:
            max_num = 1       
        z+=1

def url_auslesen(seitenanzahl):
    page = 1
    h=0
    while page <= seitenanzahl:
        index_urla = urllist[h] +'&page='+str(page)
        htmlfilea = urllib.urlopen(index_urla)
        htmltexta = htmlfilea.read()
        soup = BeautifulSoup(htmltexta)
        for diva in soup.findAll('div', attrs={'class':'list-item-inner'}):
            out = diva.find('a')['href']
            print out

        page += 1

url_auslesen(seitenanzahl_auslesen)
wenn ich anstatt url_auslesen(seitenanzahl_auslesen), url_auslesen(33) eingebe klappt alles so wie es soll.

Hat villeicht nochmal jemand nen Tipp für mich?

Re: Bestimmten Text auslesen

Verfasst: Samstag 14. März 2015, 18:26
von BlackJack
@ulli82: Du übergibst die Funktion `seitenanzahl_auslesen` statt sie *aufzurufen* und damit ihren Rückgabewert zu übergeben.

Re: Bestimmten Text auslesen

Verfasst: Samstag 14. März 2015, 19:01
von Sirius3
@BlackJack: Die Funktion seitenanzahl_auslesen hat überhaupt keinen Rückgabewert, was die Sache nicht viel besser macht.

Re: Bestimmten Text auslesen

Verfasst: Sonntag 15. März 2015, 11:50
von BlackJack
@ulli82: Und keine der beiden Funktionen arbeitet mit *einer* URL sondern beide mit denen aus `urllist`, was nicht als Argument übergeben sondern einfach so aus der Umgebung genommen wird. Das ist alles ein bisschen unübersichtlich.

Verbanne alles Code von Modulebene der keine Konstanten, Funktionen, oder Klassen definiert in Funktionen. Also insbesondere auch das Hauptprogramm. Der Name für die Funktion ist nomalerweise `main()`. Und dann Teil Dein Problem auf kleinere Teilprobleme auf, solange bis ein Teilproblem mit einer einfachen Funktion lösbar ist. Löse das, teste die Funktion, und schreib dann die nächste. Solange bis eine Gesamtlösung entstanden ist. Funktionen sollten dabei ausser Konstanten nichts verwenden was nicht als Argument übergeben wurde. Sonst wird das sehr schnell sehr unübersichtlich und man kann Funktionen nicht mehr einfach Testen.

Beide ``while``-Schleifen in dem Quelltext sind im Grunde falsch gewählt und sollten ``for``-Schleifen sein.