Avatar billede hist Praktikant
08. september 2013 - 10:58 Der er 9 kommentarer og
1 løsning

Crawl en side for pris?

Jeg har fundet det her stykke script men kan ikke helt få det til at virke.
Den henter som siden i html fint nok og gemmer den i test.txt men jeg kan ikke få prisen frem,
nogen der kan hjælpe og måske forklare mig lidt om det der crawle

<?PHP
//starter curl
$ch = curl_init();

//besøger den valgt URL
curl_setopt($ch, CURLOPT_URL, "http://www.prestatips.dk/shop/da/prestashop-moduler/16-pacsoft.html");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);

$data = curl_exec($ch);
//Lukker forbindelsen igen for at spare hukommelse på serveren curl_close($ch);
//gemmer indholdet i test.txt
$file = 'test.txt';
$current = $data;
file_put_contents($file, $current);

//Regulært udtryk der matcher prisen og omlæggende html
$pris_reg = '/[0-9]{1,9}[0-9,]{1,3} DKK&lt;\/span&gt;/i';

//regulært udtryk der matcher prisen
$pris_format_regex = '/[0-9]{1,9}[0-9,]{1,3} DKK/i';

//Leder efter prisen og omlæggende html i koden.
preg_match_all($pris_reg, $current, $result, PREG_PATTERN_ORDER);
//Gemmener resultat i $result
$result = $result[0];

//Finder Prisen og valuta
preg_match_all($pris_format_regex, $result[0], $price_result, PREG_PATTERN_ORDER);
//Gemmener resultat i $result
$price_result = $price_result[0];

//Laver et foreach loop der fjerner valuta og retter evt. komma og punktum til noget om php kan bruge som et tal
foreach ($price_result as $price){
    $price = preg_replace('/DKK/i', '', $price);
    $price = preg_replace('/kr/i', '', $price);
    $price = preg_replace('/\./i', '', $price);
    $price = preg_replace('/\,/i', '.', $price);
echo "".$pris_reg."";
}
echo "".$price."";
echo "<br>".$result."";
echo "".$current."";
?>
Avatar billede erikjacobsen Ekspert
08. september 2013 - 12:48 #1
Du skal ikke skrive %lt; og %gt; men < og > - det er måske eksperten.dk??

Men der står jo priser mange steder på side, så du vil få an liste med alle priser:

Array
(
    [0] => 0,00 DKK</span>
    [1] => 0,00 DKK</span>
    [2] => 0,00 DKK</span>
    [3] => 0,00 DKK</span>
    [4] => 995,00 DKK</span>
)

og så skal du være helt sikker på at det altid er den med index 4. Kan du være sikker på det?
Avatar billede hist Praktikant
08. september 2013 - 13:14 #2
cool tak
nu virker det jeg lavede om på den her
$pris_reg = '/<span id="our_price_display">[0-9]{1,9}[0-9,]{1,3} DKK<\/span>/i';

så fik den den rigtige pris
Avatar billede hist Praktikant
08. september 2013 - 13:19 #3
men hvad nu hvis jeg også vil have overskriften
nu bruger jeg [0-9]{1,9}[0-9,]{1,3} til tal men hvis det både er bukstaver og tal hvad skal jeg så skrive
Avatar billede erikjacobsen Ekspert
08. september 2013 - 13:22 #4
Det er egentlig nemmest at matche det udenom, i stedet for at specificere hvad det er for specielle tegn, du vil matche. Dit eksempel ovenfor kunne derfor ligeså godt være:

$pris_reg = '/<span id="our_price_display">.+?DKK<\/span>/i';

Hvor .-et matcher alt. Så kan du nemlig også matche bogstaver i overskrifter.
Avatar billede hist Praktikant
08. september 2013 - 14:25 #5
den tror jeg du må skære lidt mere ud for mig :D
Avatar billede hist Praktikant
08. september 2013 - 15:24 #6
nu prøvede jeg det her men kan ikke få den overskrift ud udover i
print_r($output);

<?PHP
$titel_reg ='/<h1 style="font-size: 24px;">.+?<\/h1>/i';
preg_match_all($titel_reg, $current, $output, PREG_PATTERN_ORDER);
//preg_match($current, $pris_reg, $output);
// du finder det du skal bruge i $output[1]
print_r($output);

$output = $output[1];

echo "<br>".$output."";
?>
Avatar billede erikjacobsen Ekspert
08. september 2013 - 20:15 #7
Det er jo næsten korrekt. Men preg_match_all giver dig alle forekomster, og derfor er der et array mere, end med preg_match. Og vil du kun have titlen uden alt snask udenom, skal du sætte en parentes, så det kommer på index 1. Dette skulle vist virke

preg_match_all($titel_reg, $current, $output, PREG_PATTERN_ORDER);
//preg_match($current, $pris_reg, $output);
// du finder det du skal bruge i $output[1]
print_r($output);

$output = $output[1][0];

echo "<br>".$output."";
?>
Avatar billede erikjacobsen Ekspert
08. september 2013 - 20:16 #8
Og der manglede lige en linie før preg_match_all:

$titel_reg ='/<h1 style="font-size: 24px;">(.+?)<\/h1>/i';
Avatar billede hist Praktikant
10. september 2013 - 19:04 #9
Super nu virker det mange tak :D
Men har et spørgsmål mere hvis det er okay
Avatar billede hist Praktikant
11. september 2013 - 20:08 #10
ok smider et svar så kan jeg oprette et nyt spørgsmål.
men super mange tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester