Gå til innhold

Feilmelding: "TypeError: coercing to Unicode: need string or buffer, tuple found"


Anbefalte innlegg

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 :yes:

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:

254873.jpeg

 

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
Videoannonse
Annonse

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

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 :D.

 

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

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

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

Prøvd meg litt til i natt:

256068.jpeg

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...