Gå til innhold

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


Anbefalte innlegg

Skrevet

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!

Videoannonse
Annonse
Skrevet

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

Skrevet

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!

Skrevet

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?

Skrevet

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

Skrevet

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.

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

Skrevet

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

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

Skrevet

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.

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...