jeg_lyver_mye Skrevet 15. september 2008 Del Skrevet 15. september 2008 Hei! Jeg vil lære python! Så jeg sitti å lest en del på nettet, jeg har tenkt å lage meg en liten robot som crawler etter alt han ser og lagrer på disken min! Bare for moro Kanskje det dummeste men... jeg syntes det virker moro. Jeg sliter! import re import urllib counter = 0 def loadWebpage(url): global counter counter += 1 html = urllib.urlopen(url).read() filename = "%s.html", counter file = open(filename, "w") file.write(html) file.close() print url p = re.compile(r'/"(https?:\/\/[a-z0-9~#%@\&:=?\/\.,_-]+[a-z0-9~#%@\&=?\+\/_-]+)"/is') webpages = p.findall(url) for webpage in webpages: loadWebpage(webpage) loadWebpage("http://vg.no/") Og her er screenshot av feilmeldingen: Annet rusk og faenskap i koden som er bare dumt og tips og triks og alt! Taes i mot med stor takk! Takk! Lenke til kommentar
terjeelde Skrevet 15. september 2008 Del Skrevet 15. september 2008 Ahh, en sånn fillefeil som er vanskelig å finne, fordi alt ser rett ut. Her er nok synderen: filename = "%s.html", counter Denne setter filename til en liste av "%s.html" og counter. Skal være: filename = "%s.html" % counter Kult at du vil lære Python. Jeg er veldig godt fornøyd, og har mye gøy med språket. Lenke til kommentar
jeg_lyver_mye Skrevet 15. september 2008 Forfatter Del Skrevet 15. september 2008 Hei! Tusen takk! Det fungerte jo strålende! Men! Loopen min vil ikke kjøre. Sånn ser koden ut nå: import re import urllib counter = 0 def loadWebpage(url): global counter counter += 1 html = urllib.urlopen(url).read() filename = "%s.html" % counter file = open(filename, "w") file.write(html) file.close() print url p = re.compile(r'href="(http://[a-zA-Z0-9~#%@\&:=?/\.,_-]+[a-zA-Z0-9~#%@\&=?\+/_-]+)"') webpages = p.findall(url) print webpages for webpage in webpages: loadWebpage(webpage) loadWebpage("http://vg.no/") Pokker meg digg at jeg kan bruke print til alt . Jeg vet at den regexp skal funke... fordi jeg prøvde den i et program som heter Kodos, som vist skal sjekke om regexp fungerer i python.. eller matcher! Matcher jo en HAUG i VG! Likevel er den tom den, findall! Bruker jeg feil? Jeg har faktisk googla svært mye nå om å loope regexp, men det er seriøst dårlig med innhold på dette! Takk! Lenke til kommentar
terjeelde Skrevet 15. september 2008 Del Skrevet 15. september 2008 Hvis målet ditt er å finne alle http(s) lenker, så ville jeg heller sett på lxml. Hvis du parser en html/xhtml-side, så kan du gjøre xpath-queries mot den: allLinksInTheWholePage = tree.xpath("//a") for link in allLinksInTheWholePage: print "Link: %s" % link.attrib['href'] Litt greiere å forholde seg til? Lenke til kommentar
steingrim Skrevet 15. september 2008 Del Skrevet 15. september 2008 Hvordan takler lxml all den elendige htmlen man finner rundt? Selv pleier jeg bruke BeautifulSoup til html-parsing, den er forbausende flink. Lenke til kommentar
jeg_lyver_mye Skrevet 15. september 2008 Forfatter Del Skrevet 15. september 2008 lxml er ikke del av python 2.5 nei? så jeg må laste ned og installere...? BeautifulSoup virka jo veldig intressant!! Er jeg... aviker el. hvis jeg bruker den...? Jeg vil bruke det som er det enkleste og mest _fleksible_! Og jeg syntes den BeautifulSoup greia virka veldig bra . Lenke til kommentar
terjeelde Skrevet 15. september 2008 Del Skrevet 15. september 2008 lxml kan importere enten html, eller xhtml/xml. Når den leser i xml-modus, så stiller den krav til dokumentet, men om du drar inn siden med html-import-funksjonene, så gjør den sitt beste for å få ting saklig. Jeg vil absolutt anbefale at du ser på lxml eller lignende for slike ting. Speselt xpath er spennende. Det er litt knot å lære førstegang kanskje, men sparer deg for mye senere. Muligheten for å gjøre ting som: doc.xpath( "//span[@id='firstname']" ) For å hente ut fornavn fra ett skjema f.eks, er rett og slett ganske behagelig. Lenke til kommentar
terjeelde Skrevet 15. september 2008 Del Skrevet 15. september 2008 lxml er ikke del av python 2.5 nei? Nei, ikke standarddel. Kort fortalt er lxml en sak som bruker "standard" libxml2 og libxslt i bunn, men i stedet for å være en tynn wrapper, så gjør den litt mer, slik at det blir behagelig å bruke fra Python. Muligheten til å f.eks jobbe med attributter som: element.attrib['bar'] = 'baz' F.eks. Alt blir relativt naturlig og greit. Ulempen er nettopp at den ikke er tilgjengelig overalt, det er ekstra å installere osv. Jeg synes det er verdt det, men det er klart det kanskje ikke passer alle steder. Lenke til kommentar
steingrim Skrevet 15. september 2008 Del Skrevet 15. september 2008 Installer setuptools så er det bare å gjøre easy_install --install-dir=~/python BeautifulSoup http://peak.telecommunity.com/DevCenter/EasyInstall Lenke til kommentar
jeg_lyver_mye Skrevet 17. september 2008 Forfatter Del Skrevet 17. september 2008 Prøvd meg litt til i natt: Kode: import re import urllib from BeautifulSoup import BeautifulSoup counter = 0 def loadWebpage(url): global counter counter += 1 print counter print url html = urllib.urlopen(url).read() filename = "%s.html" % counter file = open(filename, "w") file.write(html) file.close() soup = BeautifulSoup(html) for item in soup('a', {'href' : re.compile('.*')}): loadWebpage(item['href']) loadWebpage("http://vg.no/") Dette sa meg dessverre ingenting. Lenke til kommentar
genstian Skrevet 18. september 2008 Del Skrevet 18. september 2008 Scriptet ditt kan ikke laste url som har et slikt element "https://www.diskusjon.no/index.php?showtopic=1009465&st=0&gopid=12001192entry12001192", altså ting som har #etellerannet i seg. Lenke til kommentar
terjeelde Skrevet 18. september 2008 Del Skrevet 18. september 2008 Scriptet ditt kan ikke laste url som har et slikt element "https://www.diskusjon.no/index.php?showtopic=1009465&st=0&gopid=12001192entry12001192", altså ting som har #etellerannet i seg. Det gir jo bra mening egentlig. Trenger det ikke heller, siden #something er en referanse i dokumentet, og ikke en del av URLen. Kan gjøre noe ala: url = "http://www.diskusjon.no/index.php?showtopic=1009465&st=0&gopid=12001192entry12001192" if url.count("#"): url = url.split("#",1)[0] Eller i klartekst: Hvis URLen inneholder "#", så erstatt den med bare den delen som er forran tegnet. Da får du dradd ned uten problem. Lenke til kommentar
NevroMance Skrevet 19. september 2008 Del Skrevet 19. september 2008 Eller du kan legge inn # som et spessialtegn. Vil tro det enten er \# eller %#, ikke helt vant til python enda, men en av de burde fungere. Lenke til kommentar
genstian Skrevet 19. september 2008 Del Skrevet 19. september 2008 Men hva skal du med # uansett? Den stiller jo bare browseren din til elementet med den IDen, om du vil ha det elementet så se på xml.dom eller noe slikt. NervoMance: Du kan ikke hente ut en url med #EtEllerAnnet uansett da det ikke er en del av urlen men en referanse til et element. Lenke til kommentar
NevroMance Skrevet 19. september 2008 Del Skrevet 19. september 2008 Ok. Da er det jo ingen vits i å ha det med i det hele tatt da. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå