|
[ davor4 @ 12.03.2009. 22:07 ] @
| Preko curl funkcije u php-u pokupio sam sadržaj stranice sa vremenskom prognozom. Sada bih iz te stranice htio izvući samo određene podatke. Čitao sam da se može sa preg_replace funkcijom, međutim nisam naišao na primjer povezan s curl-om. Može li se sadržaj curl_exec spremiti u string, pa da s tim stringom manipuliram preko funkcije str_replace i sličnih.
Hvala |
[ Nemke_BG @ 12.03.2009. 22:17 ] @
cek mozda je zato sto mi se mnogo spava ali ja nisam ukapirao sta ti treba.....ako si vec uspeo da uzmes sadrzaj te stranice i znas da ces da je parsujes sa preg_replace-om....u cemu je onda problem?
[ davor4 @ 13.03.2009. 11:06 ] @
dakle pokupio sam cijelu stranicu, a ja želim iskoristiti samo prognozu za naredna dva dana, u °C. međutim nije mi jasno može li se to izvesti i kako sa preg_replace
[ kazil @ 13.03.2009. 11:19 ] @
Moze. Kako? Tesko.
Edit: Iskopao sam nesto sto sam davno radio. Ovo je deo klase zaduzene bas za vadjenje podataka iz html file-a. Nisam radio samo to da izvadim taj deo pa ga objavim kod sebe, nego sam bas vadio sve podatke i radio snjima sta sam vec hteo - prevodio sa engleskog na srpski :D
Code:
private function getForecast(&$file_content)
{
$forecast = array();
for($i=0;$i<$this->number_of_days_for_forecast;$i++){
$j=$i+1;
// For the last day it's a bit different regex
$regex_1st_part = "'<div \s class=\"wXforecast-detailed-day-int\" \s id=\"wXforecast-day-".$i."\">(.*?)";
($i==6) ? $regex_2nd_part = "<div \s class=\"wXforecast-additional\">'ixs" : $regex_2nd_part = "<div \s class=\"wXforecast-detailed-day-int\" \s id=\"wXforecast-day-".$j."\">'ixs";
$regex = $regex_1st_part . $regex_2nd_part;
preg_match($regex,$file_content,$forecast[$i]);
}
foreach($forecast as $key => $val){
$forecast[$key] = $forecast[$key][1];
}
$tmp_forecast = array();
foreach($forecast as $key => $val){
// Get the day
preg_match("'<div \s class=\"wXfore-day\">(.*?)</div>'ixs",$val,$tmp_forecast['day'][$key]);
// Get the date
preg_match("'<div \s class=\"wXfore-date\">(.*?)</div>'ixs",$val,$tmp_forecast['date'][$key]);
// Get the image
preg_match("'<div \s class=\"wXfore-day-img\">(.*?)</div>'ixs",$val,$tmp_forecast['image'][$key]);
// Get the high
preg_match("'<div \s class=\"wXforecast-hi\">(.*?)</div>'ixs",$val,$tmp_forecast['high'][$key]);
// Get the low
preg_match("'<div \s class=\"wXforecast-lo\">(.*?)</div>'ixs",$val,$tmp_forecast['low'][$key]);
// Get the whole text
preg_match("'<div \s class=\"wXfore-day-desc\">(.*?)</div>'ixs",$val,$tmp_forecast['description'][$key]);
}
for($i=0;$i<count($tmp_forecast['day']);$i++){
$this->forecast[$i]['day'] = $tmp_forecast['day'][$i][1];
$this->forecast[$i]['date'] = $tmp_forecast['date'][$i][1];
$this->forecast[$i]['image'] = $tmp_forecast['image'][$i][1];
$this->forecast[$i]['high'] = $tmp_forecast['high'][$i][1];
$this->forecast[$i]['low'] = $tmp_forecast['low'][$i][1];
$this->forecast[$i]['description'] = $tmp_forecast['description'][$i][1];
}
}
[ Miroslav Ćurčić @ 13.03.2009. 12:11 ] @
Svaki sajt ima drugačiji HTML, znači rešenje ćeš morati sam sastaviti za konkretnu stranicu.
Ako ne znaš regularne izraze ili odvoj vremena da naučiš ili nemoj ni pokušavati već idi postupno sa standardnim string funkcijama (strpos, substr, explode) i u nekoliko koraka ćeš dobiti to što tražiš.
[ kazil @ 13.03.2009. 12:20 ] @
BTW, zar se ne moze to uraditi sa DOM funkcijama? http://www.php.net/manual/en/book.dom.php Nisam nikad radio snjima, al' mislim da moze, ne? :)
[ Nikola Poša @ 13.03.2009. 13:27 ] @
A zašto komplikovati sa DOM-om... Ja sam baš skoro za jedan sajt pravio robota (spajdera, crawler-a, svejedno), koji odlazi na jednu stranicu, sa nje kupi samo određene podatke (naravno sa regularnim izrazima), i posle ih smešta u jedan lokalni tekstualni fajl na mom serveru, iz kojeg ja posle vučem potrebne informacije...
Procedura je otprilike ovakva:
- sa funkcijom file dohvatim sadžaj celog HTML fajla u niz (može i sa file_get_contents, pa da se onda sve smesti u jedan string, svejedno),
- sa preg_match_all strpam sve "pogotke" u jedan niz (preg_match_all('/>[a-z0-9:\.,\-\/\sčćšđžČĆŠĐŽ()]{2,}</is', $search, $niz);),
- taj niz po potrebi obradim i upišem sve iz njega u lokalni tekstualni fajl, naravno, u formi koja meni odgovara,
- i posle sa podacima iz tog fajla mogu lako da se "igram"...
U tvom slučaju, to sa vremenskom prognozom je još lakše, jer ti u stvari samo treba da radiš ova prva dva koraka i onda odma' da kod sebe na sajtu ispisuješ ono što dobiješ. Naravno, ovaj drugi korak, odnosno taj regularni izraz, zavisi od konkretnih potreba, i od toga koje informacije želiš da izdvojiš...
[ Tudfa @ 13.03.2009. 20:59 ] @
Ako hoces nesto gotovo http://www.weather.com/ nudi razna gotova resenja sto se tice vremenske prognoze...
Ovaj link bi ti mogao biti najpre interesantan :
http://www.weather.com/services/?from=sitemap
pozZ
[ holy_knight @ 14.03.2009. 08:40 ] @
Nasao sam jednu skripticu :) i preradio je za svoje potrebe. Program prikazuje trenutnu temperaturu i ime fajla za sliku vremena za Novi Sad. U komentaru imas sva moguca vremena (ako zelis da pravis slike)
Code:
<?php
/*
moguce vreme
0 tornado
1 tropical storm
2 hurricane
3 severe thunderstorms
4 thunderstorms
5 mixed rain and snow
6 mixed rain and sleet
7 mixed snow and sleet
8 freezing drizzle
9 drizzle
10 freezing rain
11 showers
12 showers
13 snow flurries
14 light snow showers
15 blowing snow
16 snow
17 hail
18 sleet
19 dust
20 foggy
21 haze
22 smoky
23 blustery
24 windy
25 cold
26 cloudy
27 mostly cloudy (night)
28 mostly cloudy (day)
29 partly cloudy (night)
30 partly cloudy (day)
31 clear (night)
32 sunny
33 fair (night)
34 fair (day)
35 mixed rain and hail
36 hot
37 isolated thunderstorms
38 scattered thunderstorms
39 scattered thunderstorms
40 scattered showers
41 heavy snow
42 scattered snow showers
43 heavy snow
44 partly cloudy
45 thundershowers
46 snow showers
47 isolated thundershowers
3200 not available
*/
$data = get_data("http://weather.yahooapis.com/forecastrss?p=YIXX0006&u=c");
$vreme = format_result(get_match('/<yweather:condition text="(.*)"/isU',$data));
$temperatura = format_result(get_match('/temp="(.*)"/isU',$data));
function format_result($input)
{
return strtolower(str_replace(array(' ', '(', ')'), array('-', '-', ''), $input));
}
function get_match($regex,$content)
{
preg_match($regex,$content,$matches);
return $matches[1];
}
function get_data($url)
{
$ch = curl_init();
$timeout = 5;
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
$xml = curl_exec($ch);
curl_close($ch);
return $xml;
}
?>
<?php
echo $vreme.'.jpg';
echo '<br />temperatura: '.$temperatura;
?>
[ davor4 @ 17.03.2009. 11:19 ] @
Ovo sa yahoo-a radio ok, samo nema sve podatke koji mi trebaju.
File funkcija (pristupanje url-u) je disabled na mom serveru.
Napravio sam ovo:
Code: $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.......meteo_stranica.html");
curl_setopt($ch, CURLOPT_HEADER, 0);
$cc = curl_exec($ch);
curl_close($ch);
Mogu li kako posremiti sadržaj te stranice kojoj se pristupa preko curl-a u neki string pa da pokušam sa string funkcijama doći do onoga što mi treba, jer regularni izrazi mi nisu jasni.
[ kazil @ 17.03.2009. 11:39 ] @
Pa vec si pospremio, u $cc
[ Nikola Poša @ 17.03.2009. 12:09 ] @
Citat: davor4: Mogu li kako posremiti sadržaj te stranice kojoj se pristupa preko curl-a u neki string pa da pokušam sa string funkcijama doći do onoga što mi treba, jer regularni izrazi mi nisu jasni.
Možeš i bez curl-a da dohvatiš sadržaj stranice u string, ovako:
Code:
$sadrzaj = file_get_contents('http://www.......meteo_stranica.html');
Ako je samo to cilj, ili možda ti baš hoceš da koristiš curl...
[ kazil @ 17.03.2009. 12:10 ] @
@Nikola Davor je rekao da je file funkcija iskljucena.
[ Nikola Poša @ 17.03.2009. 12:11 ] @
Izvinjavam se, nisam obratio pažnju... :S
[ davor4 @ 17.03.2009. 14:33 ] @
Da, file funkcija radi samo za fajlove na accountu.
Citat:
kazil: Pa vec si pospremio, u $cc
nisam baš siguran da je funkcija curl_exec spremila stranicu kao string u $cc, jer kad stavim echo $cc dobivam: "1"
[ kazil @ 17.03.2009. 14:52 ] @
Ah, da. Treba postaviti CURLOPT_RETURNTRANSFER flag:
Code:
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, "http://www.......meteo_stranica.html");
curl_setopt($ch, CURLOPT_HEADER, 0);
$cc = curl_exec($ch);
curl_close($ch);
[ davor4 @ 17.03.2009. 16:46 ] @
ok, uspio sam pokupiti stranicu, i uz pomoć preg_match_all došao sam do dana i datuma. Kako bi došao do temperature i naziva gif-u iz ovih linija:
Code:
<TD><IMG SRC=7.gif></TD>
<TD><b>1 °C</b><br><font color="#208C12">34 °F</font></TD>
<TD><b>11 °C</b><br><font color="#208C12">52 °F</font></TD>
[ Nikola Poša @ 17.03.2009. 17:03 ] @
Evo za početak probaj ovako nešto...
Pattern za naziv gif-a: /<td><img src\s?=\s?([a-Z0-9]+)\.gif><\/td>/i
Pattern za temperature: /<td><b>([.]+)</b><br><font color\s?=\s?\"#208C12\">([.]+)<\/font><\/td>/i
Naravno, to bi išlo sa preg_match_all, pa bi onda posle uzimao "pogotke" iz onog niza koji mu se prosleđuje kao treći argument. E sad ne znam dal' ti odjednom treba da dobiješ i gif i temperature ili...
[ davor4 @ 17.03.2009. 17:18 ] @
Nemoram dobiti odjedom gif i temperature, bitno da ih imam u array-u, ostalo mogu srediti kod ispisa
U ovoj liniji mi je javilo grešku pa sam dodao '\' :
/<td><b>([.]+)< \/b><br><font color\s?=\s?\"#208C12\">([.]+)<\/font><\/td>/i
dok mi ova linija Code: preg_match_all('/<td><img src\s?=\s?([a-Z0-9]+)\.gif><\/td>/i', $cc, $icon); izbacuje grešku
Citat:
Compilation failed: range out of order in character class at offset 23
[ Nikola Poša @ 17.03.2009. 18:21 ] @
Nisam siguran, ali mislim da je ta greška zbog ovog a-Z, stavi onda umesto toga a-zA-Z. Pisao sam te pattern-e iz glave, nisam ih probao, nije ni čudo što se potkrala neka greška... :)
[ davor4 @ 17.03.2009. 18:36 ] @
stavio sam za gif:
preg_match_all('/<td><img src\s?=\s?([0-9]+)\.gif><\/td>/i', $cc, $icon);
ali kao da dobijem dvostruki ispis array, dakle ovako nešto: Code: <TD><IMG SRC=7.gif></TD><br />
<TD><IMG SRC=2.gif></TD><br />
<TD><IMG SRC=26.gif></TD><br />
<TD><IMG SRC=37.gif></TD><br />
7<br />
2<br />
26<br />
37<br />
Kada temperaturu pokušam sa: /<td><b>([.]+)</b><br><font color\s?=\s?\"#208C12\">([.]+)<\/font><\/td>/i ne dobijem ništa, međutim vidim da tu ide trostruki ispis arraya. Ima li to veze s time jer tri puta izvodim preg_match_all na istom stringu, ali spremam taj rezultat u posebnu var. nije mi jasno?
[ Nikola Poša @ 17.03.2009. 18:48 ] @
Za temperature, umesto [.]+ stavi samo .+
Pročitaj malo ovde o preg_match_all f-ji... Obrati pažnju na opis tog četvrtog parametra $flags, i isprobaj malo kod tebe sve te varijante (PREG_PATTERN_ORDER, PREG_SET_ORDER, PREG_OFFSET_CAPTURE), pa izaberi onu koja ti najviše odgovara...
[ Nikola Poša @ 17.03.2009. 18:59 ] @
btw Evo sad sam i kod sebe na brzinu isprobao sve to, i ispis (u source-u), kad ispišem ta dva niza sa print_r mi izgleda ovako:
Code:
Array
(
[0] => Array
(
[0] => <TD><b>1 °C</b><br><font color="#208C12">34 °F</font></TD>
[1] => <TD><b>11 °C</b><br><font color="#208C12">52 °F</font></TD>
)
[1] => Array
(
[0] => 1 °C
[1] => 11 °C
)
[2] => Array
(
[0] => 34 °F
[1] => 52 °F
)
)
<br />
Array
(
[0] => Array
(
[0] => <TD><IMG SRC=7.gif></TD>
)
[1] => Array
(
[0] => 7
)
)
Nemoj da te čudi što preg_match_all u toj formi vraća rezultat. On će uvek u taj prvi element niza da stavi niz pogodaka za pun pattern, zatim za prvi sub-pattern (ono što su uokvirio zagradama), pa za drugi, itd...
[ davor4 @ 17.03.2009. 19:31 ] @
ubacio sam preg_set_order i sredio ispis kako mi treba.
hvala
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|