staging.inyokaproject.org

python Skript von Version 2 nach 3 portieren - Print u.s.w.

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

pregmatch

Avatar von pregmatch

Anmeldungsdatum:
30. Januar 2011

Beiträge: 484

guten Abend,

will ein Python-Script on python 2 nach python 3 portieren.

Zunächst ist print in der Version 3 zu einer Funktion geworden:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import urllib
from bs4 import BeautifulSoup
import urlparse
import mechanize


# Set the startingpoint for the spider and initialize
# the a mechanize browser object
url = "http://sparkbrowser.com"
br = mechanize.Browser()

# create lists for the urls in que and visited urls
urls = [url]
visited = [url]


# Since the amount of urls in the list is dynamic
#   we just let the spider go until some last url didn't
#   have new ones on the webpage
while len(urls)>0:
    try:
        br.open(urls[0])
        urls.pop(0)
        for link in br.links():
            newurl =  urlparse.urljoin(link.base_url,link.url)
            #print newurl
            if newurl not in visited and url in newurl:
                visited.append(newurl)
                urls.append(newurl)
                print newurl
    except:
        print "error"
        urls.pop(0)
       
print visited

Moderiert von sebix:

Thema in einen passenden Forenbereich verschoben. Bitte beachte die als wichtig markierten Themen („Welche Themen gehören hier her und welche nicht?“) in jedem Forenbereich. Danke.

Axel-Erfurt

Anmeldungsdatum:
18. Mai 2016

Beiträge: 1347

print "error" muß print ("error") werden.

Es gibt auch 2to3

https://docs.python.org/2/library/2to3.html

pregmatch

(Themenstarter)
Avatar von pregmatch

Anmeldungsdatum:
30. Januar 2011

Beiträge: 484

hallo Axel - vielen Dank!!!

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

Wenn die Frage damit beantwortet ist, bitte als geloest markieren.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

die größere Änderung am Skript ist ja, das urlib und urlparse aus P2 alle im für P3 neu strukturiertem Modul urllib liegen.

@prematch: noch ein paar Anmerkung:

  • while len(urls)>0 kannst du kürzer und eleganter als while urls: schreiben

  • ein nacktes try... except nutzt man nicht, weil man damit _alle_ Fehler - auch Programmierfehler - unterdrückt. Das macht die Fehlersuche unnötig schwer und kann zu einem unerwartetem Verhalten des Programms führen.

  • Welche Sinn hat urls.pop(0) im except? Das Skript das danach zu Ende und urls wird danach nicht mehr genutzt.

  • Das 1. Element einer Liste mittels pop zu entfernen ist relativ ineffizient. Das spielt bei diesem Skript wahrscheinlich keine Rolle, aber eine bessere Lösung für so was ist deque aus dem collections Modul.

Gruß, noisefloor

MisterIgo

Anmeldungsdatum:
23. April 2009

Beiträge: 947

Es gibt übrigens auch ein Programm 2to3, dass einen Teil der Portierungen automatisch machen kann.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

Nachtrag: den Punkt

Welche Sinn hat urls.pop(0) im except?...

aus meinem vorherigen Post bitte weg denken. Das try... except im while Block steht macht das schon Sinn.

Gruß, noisefloor

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

Andererseits macht es doch wieder keinen Sinn, weil man den Code so strukturieren kann und sollte, dass nur einmal pop(0) (oder die entsprechende Methode bei einer collections.deque) vor dem try-Block steht. „DRY“ und so. ☺

Aus visited könnte man ein set machen. Und der url in newurl sieht mir gewagt aus. Soll da wirklich getestet werden ob url irgendwo in newurl enthalten ist? Ich kann mir da Fälle vorstellen wo das „false positives“ gibt.

Antworten |