Stranica: 1/2.

[Python] Uklanjanje suvisnih karaktera

Postano: 25 tra 2011, 14:54
Postao/la Bug
Pozdrav.. Nemam nekog preteranog iskustva u Pythonu pa sam bas iz tog razloga krenuo da napravim neki mali crawler. I naravno naisao na problem zvani "regualr expression", citam dva dana RE zvanicnu dokumentaciju al nesto ne razumem izgleda...

Stvar je sledeca sa stranice trebam da uzmem tekst izmedju <div id="somediv"> pa do <div id="otherdiv">
i ja sam pokusao ovako al naravno nece
(hteo sam prvo jedan deo da uklonim pa onda drugi)

Kod: Označi sve

m = re.match(r"<div id=\"shareVideo\">", data)
m.group(0)
Kako bih mogao drugacije ovo da odradim?

Re: Python: Uklanjanje suvisnih karaktera

Postano: 25 tra 2011, 16:12
Postao/la 4ndY
Bug je napisao/la: Kako bih mogao drugacije ovo da odradim?
Može se to riješiti RE-om, no ako parsaš HTML, preporučam ti neku, za tu namjenu specifičnu biblioteku:
http://www.crummy.com/software/BeautifulSoup/ - BeautifulSoup ili
http://code.google.com/p/html5lib/ - HTML5lib

Ja koristim u pravilu ovaj prvi, a tvoj problem bi riješio otprilike ovako:

Kod: Označi sve

soup = BeautifulSoup( html )
print str( soup.find( attrs={ "id" : "somediv" } ) )

Re: Python: Uklanjanje suvisnih karaktera

Postano: 25 tra 2011, 16:46
Postao/la jjj
Podržavam 4ndyjevu preporuku i dodajem lxml na popis.

Što se regexpa tiče, oni su u Pythonu vrlo slični svim ostalim implementacijama, pa osim ako ti inače nisu problem/nešto novo, ne bi smio imati problema zbog Pythona.

Ako želiš sadržaj između ta dva taga, zašto u izrazu imaš samo prvi tag? To će matchati to što imaš u izrazu. Ili nešto propuštam?


Edit:
Zašto lxml?

Re: Python: Uklanjanje suvisnih karaktera

Postano: 25 tra 2011, 17:17
Postao/la tartaglia
m = re.match(r"<div id=\"shareVideo\">", data)
m.group(0)
re.match() ce nac samo pojavu paterna na pocetku stringa, za tvoju potrebu je bolje
re.search() ako ti treba samo prva pojava onog kaj trazis ili
re.findall() ako ti trebaju sve

znaci na prvu ovak nekak:
m=re.search('<div id="nav">(.*)<div id="body">',tekst, re.DOTALL)
m.group(1)
. znaci bilo koji znak osim \n, zato das re.DOTALL da pokupi sve
* nula ili vise takvik
() da mozes sa m.group(1) pokupit samo ovo između kaj te zanima

Inace, pravo ti vele ljudi, koristi modul ako ga vec ima

Re: Python: Uklanjanje suvisnih karaktera

Postano: 25 tra 2011, 19:11
Postao/la Bug
Takve sam odgovore i ocekivao :)
Probao ja BeautifulSoup ALI sa python-om 3 i naravno on pravio problema :S
Sad sam na 2.7 i sad ferca... sad jos moram da obradim podatak tipa da uklonim font i sl ...
:)
Hvala ljudi...naterali ste me da predjem na 2.7 i uradim na laksi nacin :) thanks


P.S jedno brzopotezno.. kad smo kod verzija.. ako budem citao neku knjigu da uzmem za v3 ili v2? v3 je novije ali bugovito to kontam...a dal je vredno ucenja?

Re: Python: Uklanjanje suvisnih karaktera

Postano: 25 tra 2011, 21:07
Postao/la 4ndY
Bug je napisao/la: P.S jedno brzopotezno.. kad smo kod verzija.. ako budem citao neku knjigu da uzmem za v3 ili v2? v3 je novije ali bugovito to kontam...a dal je vredno ucenja?
v2 - bez puno razmišljanja, pogotovo ako tek učiš python i to isključivo zbot toga što je Internet pun primjera za v2, a v3 još nije zaživjela... Lako poslije, kad naučiš v2, pređeš na v3. ;)

Re: Python: Uklanjanje suvisnih karaktera

Postano: 26 tra 2011, 16:19
Postao/la Bug
hvala na odgovoru 4ndY

jos jedno pitanje (da ne otvaram novu temu za jedno kratko pitanje)
kad uradim lista.sorted()
on mi poredja ['tags-1.txt', 'tags-10.txt', 'tags-2.txt', 'tags-3.txt', 'tags-4.txt', 'tags-5.txt']
kako da ga "opametim" da je tags-10.txt najveci broj? Ja razumem zasto on tako izbacuje...al mene interesuje jel moguc to izbeci? A ne mogu/ne smem da dodajem nulu kod jednocifrenih brojeva...

Re: Python: Uklanjanje suvisnih karaktera

Postano: 26 tra 2011, 18:54
Postao/la 4ndY
Bug je napisao/la: jos jedno pitanje (da ne otvaram novu temu za jedno kratko pitanje)
kad uradim lista.sorted()
on mi poredja ['tags-1.txt', 'tags-10.txt', 'tags-2.txt', 'tags-3.txt', 'tags-4.txt', 'tags-5.txt']
kako da ga "opametim" da je tags-10.txt najveci broj? Ja razumem zasto on tako izbacuje...al mene interesuje jel moguc to izbeci? A ne mogu/ne smem da dodajem nulu kod jednocifrenih brojeva...
Imaš više rješenja za ovo.
Prvo je "ručno" - da očitaš taj broj iz stringa (npr. regexpom) i onda sortiraš normalno po brojevima.
Druge mogućnosti su da pogledaš što ti nudi metoda sorted():
http://docs.python.org/library/functions.html#sorted
http://wiki.python.org/moin/HowTo/Sorting/

Ovo s cmp-om se svodi na prvo rješenje - moraš napisati funkciju koja će razlikovati dvije stavke liste na način koji želiš.

Javi ako zapneš...

Re: Python: Uklanjanje suvisnih karaktera

Postano: 26 tra 2011, 19:32
Postao/la jjj
4ndY je napisao/la:
Bug je napisao/la: P.S jedno brzopotezno.. kad smo kod verzija.. ako budem citao neku knjigu da uzmem za v3 ili v2? v3 je novije ali bugovito to kontam...a dal je vredno ucenja?
v2 - bez puno razmišljanja, pogotovo ako tek učiš python i to isključivo zbot toga što je Internet pun primjera za v2, a v3 još nije zaživjela... Lako poslije, kad naučiš v2, pređeš na v3. ;)
Istina, no ipak (s vremenom, kada osjećaš da si svladao v2 dovoljno dobro) pogledaj razlike u v3 - nisu prevelike, a dobar dio najvećih/važnijih projekata ili prelazi ili namjerava prijeći na v3.

Re: Python: Uklanjanje suvisnih karaktera

Postano: 26 tra 2011, 23:58
Postao/la Bug
Ok, smislio sam lakse resenje.. posto sam svakako hteo da proveravam jel fajl postoji pa da izbegnem regexp setio se da ima os.path.exists pa tako proverim fajl...mnogo lakse nego da sam izvlacio brojeve i sl...

e sad sam napravio da to lepo radi ...ostalo mi jos jedna stvar za koju mi treba ideja...
scripta ce se pokretati preko ssh-a (a i preko cron job-a) kako bi ja mogao najbolje da napravim da je mogu stopirati u slucaju da mi je potrebno(ima da radi danima treba 250k + stranica da obradi, pa da je ne cekam da ona zavrsi)
Mogao bi da ubijem ID procesa, ali kako tu da priskocim?
Nisam nikad to radio pa nema ni neku ideju...


P.s modovi ajd molim vas naziv teme da promenite u nesto korisnije "python: wanna be programer" i sl :)