2017-06-30 10 views
-1

Ich versuche, die folgende URL https://www.astegiudiziarie.it/vendita-asta-appartamento-genova-via-san-giovanni-d’acri-14-1360824 mit PHP cURL zum Download Download:PHP cURL URL mit Sonderzeichen

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'https://www.astegiudiziarie.it/vendita-asta-appartamento-genova-via-san-giovanni-d’acri-14-1360824'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$f = curl_exec($ch); 
curl_close($ch); 
echo $f; 

aber der Server immer wieder eine Fehlerseite. Das Navigieren derselben URL in einem Webbrowser funktioniert einwandfrei. Manuelles Vergleichen der HTML-Quelle, die von curl_exec mit der HTML-Quelle in einem Webbrowser zurückgegeben wird, ist der Unterschied sofort bemerkbar.

Ich versuchte utf8_decode() die URL ohne Erfolg.

Ich kann nicht einfach wickeln die URL in urlencode(), weil es auch normale Zeichen wie : und / kodieren.

Diese URLs werden programmgesteuert abgerufen (Scrapping) und haben nicht immer die gleiche Struktur, so dass es schwierig wäre, sie zu teilen und nur einige Teile urlencode.

Btw, es scheint, dass moderne Webbrowser diesen Fall sehr gut behandeln. Gibt es dafür eine Lösung in PHP?

Antwort

0

Ich landete schließlich auf mit:

function urlencode_parts($url) { 
    $parts = parse_url($url); 
    $parts['path'] = implode('/', array_map('urlencode', explode('/', $parts['path']))); 
    $url = new \http\Url($parts); 
    return $url->toString(); 
} 

mit dem Paket \http\Url, die http_build_url Funktion in neuesten PHP-Versionen ersetzt.

Scheint, dass file_get_contents nicht auch mit Sonderzeichen funktioniert.

0

versuchen Sie dies:

$get_url = 'https://www.astegiudiziarie.it/vendita-asta-appartamento-genova-via-san-giovanni-d’acri-14-1360824'; 
$get_init = explode('//',$get_url);     // get only HTTPS or HTTP from URL 
$get_url = str_replace('https://', '' , $get_url); // remove this part from URL 
$get_url = str_replace('http://', '' , $get_url); // case if HTTP only, remove too 
$get_url = urlencode($get_url); 
$url = $get_init[0].'//'.str_replace("%2F","/", $get_url); // Remake URL back for cURL 
     $ch = curl_init(); 
     $timeout = 5; 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
     $string = curl_exec($ch); 
     curl_close($ch); 
print $string; 

Demo: http://phpfiddle.org/main/code/g41r-5wvg

EDITED: Ich denke, es ist auch möglich, otherway. Eine Annäherung von @hanshenrik mit kleinen Änderungen zu betrachten, würde auch funktionieren.

$get_url=parse_url('https://www.astegiudiziarie.it/vendita-asta-appartamento-genova-via-san-giovanni-d’acri-14-1360824'); 
$url=$get_url['scheme'].'://'.$get_url['host'].str_replace("%2F","/", urlencode($get_url['path'])); 
     $ch = curl_init(); 
     $timeout = 5; 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
     $string = curl_exec($ch); 
     curl_close($ch); 
print $string; 
+0

Sie manuell das Sonderzeichen codiert, und es hat offensichtlich funktioniert. Aber die URL wird programmgesteuert abgerufen (Scrapping). Die Frage lautete, eine solche Kodierung programmatisch zu machen. –

+0

Ich habe meine Antwort bearbeitet, versuchen Sie es erneut ... –

+0

Ein bisschen hackish, teilen URL in Teilen, Codierung sie separat funktioniert.Ich habe mich nur gefragt, ob es einen schöneren Weg gibt, es zu tun. –

1

Ihre URL ist bereits verschlüsselt. Rufen Sie nicht urlencode() darauf als der Grund, warum Sie 404 bekommen, als Server dekodiert nur einmal. Entfernen Sie einfach den Anruf.

0

Parsen Sie die URL-Komponenten und codieren Sie sie dann.

Die Idee besteht darin, urlencode() nur auf den Pfad und Abfrage Teile der URL zu verwenden, das ursprüngliche Segment allein lassen. Ich glaube, das ist, was Browser hinter den Kulissen tun.

Sie können parse_url() verwenden, um die URL in ihre Komponenten aufzuteilen, die benötigten Teile zu entfliehen (am wahrscheinlichsten Pfad und Abfrage) und sie wieder zusammenzusetzen. Jemand hat sogar eine Funktion gepostet, um die URL in den Kommentaren zu parse_url()documentation page wieder zusammenzusetzen. vielleicht

+0

Ein bisschen hackish, URL in Teilen teilen, separat kodieren funktioniert. Ich habe mich nur gefragt, ob es einen schöneren Weg gibt, es zu tun. –

0

$urli=parse_url('https://www.astegiudiziarie.it/vendita-asta-appartamento-genova-via-san-giovanni-d’acri-14-1360824'); 
$url=urli['scheme'].'://'.$urli['host'].'/'.urlencode(ltrim('/',$urli['path'])).'?'.$urli['query']; 
+0

Ein bisschen hackish, URL in Teilen teilen, separat kodieren funktioniert. Ich habe mich nur gefragt, ob es einen schöneren Weg gibt, es zu tun. –