WN

WN (https://www.wn.se/forum/index.php)
-   Webbhotell (https://www.wn.se/forum/forumdisplay.php?f=13)
-   -   Hämta filer med php script (lite hjälp) (https://www.wn.se/forum/showthread.php?t=1040437)

it-shoppen 2010-02-09 12:13

Hämta filer med php script (lite hjälp)
 
Hej

Söker ett skript som hämtar filer info enligt en fil-lista.

Har ett script färdigt men det hämtar bara en sida och inte alla från listan.

<?php
$url = "XXXXXX347415";
$content = file_get_contents($url);

$titlestart=strpos($content,"<table>");
$titleslut = strpos($content,"</table>");

$spec=substr($content,$titlestart,$titleslut-$titlestart)."</table>";

file_put_contents("347415.htm",$spec,LOCK_EX);

?>

<?php echo $spec; ?>

emilv 2010-02-09 12:20

Det ser ut som att du försöker tolka HTML med något som liknar reguljära uttryck. Jag rekommenderar att du använder PHPs in inbyggda XML-klasser för att tolka dokument istället, så kan du till exempel plocka ut alla noder av en viss typ och iterera över dem, alltså oavsett hur många noder det är.

Ett enkelt exempel där jag skriver ut innehållet i alla <p>-element:

Kod:

$html = new DOMDocument();
$html->loadHTML($content);

$ps = $html->getElementByTagName('p');
for($i = 1; $i < $ps->length; $i++) {
    echo $ps->item($i)->nodeValue . "\n";
}


it-shoppen 2010-02-09 12:34

Citat:

Ursprungligen postat av emilv (Inlägg 20342152)
Det ser ut som att du försöker tolka HTML med något som liknar reguljära uttryck. Jag rekommenderar att du använder PHPs in inbyggda XML-klasser för att tolka dokument istället, så kan du till exempel plocka ut alla noder av en viss typ och iterera över dem, alltså oavsett hur många noder det är.

Ett enkelt exempel där jag skriver ut innehållet i alla <p>-element:

Kod:

$html = new DOMDocument();
$html->loadHTML($content);

$ps = $html->getElementByTagName('p');
for($i = 1; $i < $ps->length; $i++) {
    echo $ps->item($i)->nodeValue . "\n";
}



Ditt script fungerar nog också men det hjälper inte mig.
Det hämtar ändå bara från 1st angiven sida och inte enligt fillistan.txt med ca 1000 länkar.

emilv 2010-02-09 12:55

Mitt skript visar en metod att tolka HTML-filer. Du har ännu inte sagt vad du ska med det till, eller ens vad som blir fel.

it-shoppen 2010-02-09 13:01

Citat:

Ursprungligen postat av emilv (Inlägg 20342157)
Mitt skript visar en metod att tolka HTML-filer. Du har ännu inte sagt vad du ska med det till, eller ens vad som blir fel.

Söker ett skript som hämtar filer enligt en fillista.txt

Scriptet ska läsa först länken i fillista.txt
och med hjälp av reguljära uttryck hämta tex en tabel som finns på den sidan länk 1 hänvisar till i fillista.txt
När den är hämtad ska den spars ner till en fil med det fil namn som finns i länk nr 1 i fillistan
Där efter börjar det om igen med länk nr 2 och så vidare.

Scriptet jag har fungerar men doch bara på 1st angiven länk sida.

hnn 2010-02-09 13:35

Citat:

Ursprungligen postat av emilv (Inlägg 20342152)
Det ser ut som att du försöker tolka HTML med något som liknar reguljära uttryck. Jag rekommenderar att du använder PHPs in inbyggda XML-klasser för att tolka dokument istället, så kan du till exempel plocka ut alla noder av en viss typ och iterera över dem, alltså oavsett hur många noder det är.

Ett enkelt exempel där jag skriver ut innehållet i alla <p>-element:

Kod:

$html = new DOMDocument();
$html->loadHTML($content);

$ps = $html->getElementByTagName('p');
for($i = 1; $i < $ps->length; $i++) {
    echo $ps->item($i)->nodeValue . "\n";
}


Långt ifrån alla sidor är XHTML kompitabla. Och därmed så kommer inte XML klasserna att funka.

Men däremot är de att rekommendera.

crazzy 2010-02-09 23:20

Citat:

Ursprungligen postat av it-shoppen (Inlägg 20342160)
Söker ett skript som hämtar filer enligt en fillista.txt

Scriptet ska läsa först länken i fillista.txt
och med hjälp av reguljära uttryck hämta tex en tabel som finns på den sidan länk 1 hänvisar till i fillista.txt
När den är hämtad ska den spars ner till en fil med det fil namn som finns i länk nr 1 i fillistan
Där efter börjar det om igen med länk nr 2 och så vidare.

Scriptet jag har fungerar men doch bara på 1st angiven länk sida.

lite kod att spinna vidare på:
Kod:

$list = file_get_contents("listan.txt");
$urls = explode("\n",$list);
foreach($urls as $url) {
    $file = file_get_contents($url);
    /* Insert other blablabla-code here */
}


it-shoppen 2010-02-10 08:32

Citat:

Ursprungligen postat av crazzy (Inlägg 20342244)
lite kod att spinna vidare på:
Kod:

<?php
$list = file_get_contents("listan.txt");
$urls = explode("\n",$list);
foreach($urls as $url) {
    $file = file_get_contents($url);
    /* Insert other blablabla-code here */
}
?>


Tackar det kan vara något till att börja med.

Testade det och fick felmedelande.

Warning: file_get_contents() [function.file-get-contents]: Filename cannot be empty in C:\wamp\www\script\test.php on line 5

emilv 2010-02-10 09:24

Troligtvis innehåller din list-fil även en radbrytning på slutet av sista raden. Det gör att loopen kör en sista gång på en tom rad. Lägg in en if-sats i början av loopen och kolla om raden är tom.

it-shoppen 2010-02-10 09:55

Citat:

Ursprungligen postat av emilv (Inlägg 20342258)
Troligtvis innehåller din list-fil även en radbrytning på slutet av sista raden. Det gör att loopen kör en sista gång på en tom rad. Lägg in en if-sats i början av loopen och kolla om raden är tom.

Tog bort radbrytningen i list-filen.tex

Koden fungerar bra så långt.

Men den hämtar dock bara info från sista länken "raden" i list-filen.

<?php
$list = file_get_contents("listan.txt");
$urls = explode("\n",$list);
foreach($urls as $url) {
$file = file_get_contents($url);
$tablestart=strpos($file,"<table>");
$tableslut = strpos($file,"</table>");

$spec=substr($file,$tablestart,$tableslut-$tablestart)."</table>";



/* Insert other blablabla-code here */
}
?>
<?php echo $spec; ?>

BjörnJ 2010-02-10 10:11

PHP-kod:

<?php
$list 
file_get_contents("listan.txt");
$urls explode("\n",$list);
foreach(
$urls as $url) {
    
$file file_get_contents($url);
    
$tablestart=strpos($file,"<table>");
    
$tableslut strpos($file,"</table>");

    
$spec=substr($file,$tablestart,$tableslut-$tablestart)."</table>";
}
?>
<?php 
echo $spec?>

$spec blir ju överskriven varje varv i loopen, så när den har loopat klart innehåller $spec bara tabellen från sista filen.

it-shoppen 2010-02-10 10:15

Citat:

Ursprungligen postat av BjörnJ (Inlägg 20342261)
PHP-kod:

<?php
$list 
file_get_contents("listan.txt");
$urls explode("\n",$list);
foreach(
$urls as $url) {
    
$file file_get_contents($url);
    
$tablestart=strpos($file,"<table>");
    
$tableslut strpos($file,"</table>");

    
$spec=substr($file,$tablestart,$tableslut-$tablestart)."</table>";
}
?>
<?php 
echo $spec?>

$spec blir ju överskriven varje varv i loopen, så när den har loopat klart innehåller $spec bara tabellen från sista filen.

Japp jag komm på det :)

Då är frågan bara hur man ska koda för att få varje rad sparad som en fil.

BjörnJ 2010-02-10 10:23

Citat:

Ursprungligen postat av it-shoppen (Inlägg 20342263)
Då är frågan bara hur man ska koda för att få varje rad sparad som en fil.

http://se2.php.net/manual/en/function.fopen.php

it-shoppen 2010-02-10 10:59

Citat:

Ursprungligen postat av BjörnJ (Inlägg 20342265)

Då kan jag använda denna funktionen

file_put_contents

Men måste väll ha någon counter eller någon så att alla filer sparas med olika filnamn.

BjörnJ 2010-02-10 13:25

Citat:

Ursprungligen postat av it-shoppen (Inlägg 20342266)
Men måste väll ha någon counter eller någon så att alla filer sparas med olika filnamn.

Du skulle t.ex. kunna lägga $filnr=0; före loopen, och $filnr++; i loopen, och använda $filnr som en del av filnamnet.

it-shoppen 2010-02-10 14:02

Citat:

Ursprungligen postat av BjörnJ (Inlägg 20342281)
Du skulle t.ex. kunna lägga $filnr=0; före loopen, och $filnr++; i loopen, och använda $filnr som en del av filnamnet.

Ja det skulle säkert fungera men är överkurs för mig :)

Ännu bättre vore om man kunde få ut siffrorna från länken i fil-listan

Länkarna ser ut så här: xxx = dold katalog

http://xxx/xxx/ki.aspx?sku=334512&view=detailed
http://xxx/xxx/ki.aspx?sku=334425&view=detailed
http://xxx/xxx/ki.aspx?sku=334514&view=detailed
http://xxx/xxx/ki.aspx?sku=344466&view=detailed

Här skulle man försöka få ut namnet i första loppen 334512
och som då blir namnet på "filnr1" 334512.htm
och nästa fil kommer då få namnet 334525.htm

hnn 2010-02-10 14:07

Citat:

Ursprungligen postat av it-shoppen (Inlägg 20342285)
Ja det skulle säkert fungera men är överkurs för mig :)

Ännu bättre vore om man kunde få ut siffrorna från länken i fil-listan

Länkarna ser ut så här: xxx = dold katalog

http://xxx/xxx/ki.aspx?sku=334512&view=detailed
http://xxx/xxx/ki.aspx?sku=334425&view=detailed
http://xxx/xxx/ki.aspx?sku=334514&view=detailed
http://xxx/xxx/ki.aspx?sku=344466&view=detailed

Här skulle man försöka få ut i första loppen 334512
som blir namnet på filen 334512.htm
och nästa fil kommer få namnet 334525.htm


Vet Komplett om att du snor deras produkttexter?

För ni som tvivlar:

http://www.komplett.se/k/ki.aspx?sku=434502
http://www.komplett.se/k/ki.aspx?sku...&view=detailed

Matchar ganska exakt in på länkarna du angivit

BjörnJ 2010-02-10 14:19

Om numret alltid är på samma position och har samma längd:
PHP-kod:

substr($url,30,6).'.html' 

där 30 får justeras till rätt position.

Du måste förstås ha tillstånd om det är så att du har tänkt kopiera information från någon annans sida och publicera den själv.

it-shoppen 2010-02-10 16:31

Citat:

Ursprungligen postat av BjörnJ (Inlägg 20342289)
Om numret alltid är på samma position och har samma längd:
PHP-kod:

substr($url,30,6).'.html' 

där 30 får justeras till rätt position.

Du måste förstås ha tillstånd om det är så att du har tänkt kopiera information från någon annans sida och publicera den själv.

Har fått det att fungera nu.
Ett lite problem bara ÅÄÖ blir fel i den sparade html filen.
Har testat och spara i txt samt i php filer och då blir det rätt.
Blir även rätt vid visning php echo


Alla tider är GMT +2. Klockan är nu 03:24.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson