Bestimmten Text auslesen

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
ulli82
User
Beiträge: 8
Registriert: Freitag 20. Februar 2015, 21:32

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.
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.
ulli82
User
Beiträge: 8
Registriert: Freitag 20. Februar 2015, 21:32

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.
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

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...)
ulli82
User
Beiträge: 8
Registriert: Freitag 20. Februar 2015, 21:32

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...
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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?
In specifications, Murphy's Law supersedes Ohm's.
ulli82
User
Beiträge: 8
Registriert: Freitag 20. Februar 2015, 21:32

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
ulli82
User
Beiträge: 8
Registriert: Freitag 20. Februar 2015, 21:32

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?
BlackJack

@ulli82: Du übergibst die Funktion `seitenanzahl_auslesen` statt sie *aufzurufen* und damit ihren Rückgabewert zu übergeben.
Sirius3
User
Beiträge: 18260
Registriert: Sonntag 21. Oktober 2012, 17:20

@BlackJack: Die Funktion seitenanzahl_auslesen hat überhaupt keinen Rückgabewert, was die Sache nicht viel besser macht.
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.
Antworten