Come raschiare il contenuto dell’iframe, con cURL

Obiettivo: voglio raschiare la parola “Paris” all’interno di un iframe con cURL.

Dici di avere una semplice pagina con un iframe:

<html>
<head>
<title>Curl into this page</title>
</head>
<body>

<iframe src="france.html" title="test" name="test">

</body>
</html>

Iframe pagina:

<html>
<head>
<title>France</title>
</head>
<body>

<p>The Capital of France is: Paris</p>

</body>
</html>

Mio cURL script:

<?php>

//1. initialize

$ch = curl_init();

//2. The URL containing the iframe

$url = "http://localhost/test/index.html";

//3. set the options, including the url

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 2);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

//4. execute and fetch the resulting HTML output by putting into $output

$output = curl_exec($ch);

//5. free up the curl handle

curl_close($ch);

//6. Scrape for a single string/word ("Paris") 

preg_match("'The Capital of France is:(.*?). </p>'si", $output, $match);
if($match) 

//7. Display the scraped string 

echo "The Capital of France is: ".$match[1];

?>

Risultato = niente!

Qualcuno mi può aiutare a scoprire la capitale della Francia?! 😉

Ho bisogno di un esempio di:

  1. di analisi/di afferrare l’iframe url
  2. curling url (come ho fatto con il index.html pagina)
  3. il parsing della stringa “Parigi”

Grazie!

Questo non è un ricciolo di script è uno script PHP. Da non confondere con la biblioteca. E non parse HTML con regex!
Non riesco a vedere la parte in cui si carica l’iframe. Prima bisogna raschiare la pagina di indice per qualsiasi iframe, quindi caricare e raschiare. (ps come al domanda usa DOMDocument->loadHTML() per il parsing del codice HTML con PHP e non espressioni regolari)
Puoi accettare risposte?
Ho appena accettato tutte le risposte alle mie domande precedenti – grazie per la segnalazione!

OriginaleL’autore ven | 2011-12-06

3 risposte

  1. 3

    –Edit–
    Si potrebbe caricare il contenuto della pagina in una stringa, analizzare la stringa per iframe, quindi caricare l’iframe origine in un’altra stringa.

    $wrapperPage = file_get_contents('http://localhost/test/index.html');
    
    $pattern = '/\.*src=\".*\.html"\.*/';
    
    $iframeSrc = preg_match($pattern, $wrapperPage, $matches);
    
    if (!isset($matches[0])) {
        throw new Exception('No match found!');
    }
    
    $src = $matches[0];
    
    $src = str_ireplace('"', '', $src);
    $src = str_ireplace('src=', '', $src);
    $src = trim($src);
    
    $iframeContents = file_get_contents($src);
    
    var_dump($iframeContents);

    –Originale–

    Lavorare sul vostro tasso di accettazione (accettare risposte precedentemente risposto alle domande).

    L’url che si sta impostando il curl gestore di file avvolgendo l’i-frame, provare a impostare l’url dell’iframe:

    $url = "http://localhost/test/france.html";
    Credo che il problema principale è che non so come raschiare il link del iframe quindi recuperare che poi raschiare! Gli esempi che sarebbe apprezzato.
    Quando ho curl iframe pagina (france.html) tutto funziona bene. Ho bisogno di un modo per scegliere il index.html prima avevo bisogno di fare un “riccio all’interno di un ricciolo”
    Post aggiornato. Vedere se funziona.
    provare ora, ma in esecuzione in: Avviso: preg_match() [function.preg-match]: Compilation failed: nulla di ripetere all’offset 10 /Applications/XAMPP/xamppfiles/htdocs/curl/1197846/w3.php sulla linea 7 Fatal error: Uncaught exception ‘”Eccezione” con il messaggio ” Nessuna corrispondenza trovata!’ in /Applications/XAMPP/xamppfiles/htdocs/curl/1197846/w3.php:10 Stack trace: #0 {main} gettato in /Applications/XAMPP/xamppfiles/htdocs/curl/1197846/w3.php on line 10
    Provare var_dump($wrapperPage) dopo che viene inizializzato, vedere se c’è almeno il contenuto.

    OriginaleL’autore Mike Purcell

  2. 3

    notare che di tanto in tanto per una varietà di ragioni, la iframe curl non può essere letto al di fuori del contesto di un proprio server e guardando il riccio direttamente genera un certo tipo di ‘non può essere letto direttamente o all’esterno” messaggio di errore.

    in questi casi, è possibile utilizzare curl_setopt($ch, CURLOPT_REFERER, $fullpageurl); (se sei in php e la lettura del testo utilizzando curl_exec) e poi curl_exec pensa che l’iframe è la pagina originale e si può leggere la fonte.

    quindi se per qualsiasi motivo france.html non poteva essere letta al di fuori del contesto della pagina più grandi che ha incluso come un iframe, è ancora possibile ottenere la fonte con i metodi di cui sopra utilizzando CURLOPT_REFERER e l’impostazione della pagina principale (test/index.html nella domanda originale) come il referrer.

    o semplicemente impostare CURLOPT_AUTOREFERER

    OriginaleL’autore Barry

  3. 2

    Per rispondere alla tua domanda, il tuo modello non corrisponde al testo di input:

              <p>The Capitol of France is: Paris</p>

    Si dispone di un ulteriore spazio, prima della chiusura del tag di paragrafo, che non può mai corrispondere:

    preg_match("'The Capitol of France is:(.*?). </p>'si"

    Si dovrebbe avere lo spazio prima della cattura di gruppo e rimuovere il ridondante . in seguito:

    preg_match("'The Capitol of France is: (.*?)</p>'si"

    Per l’utilizzo opzionale spazio a nessuna delle due posizioni, utilizzare \s* invece:

    preg_match("'The Capitol of France is:\s*(.*?)\s*</p>'si"

    Si potrebbe anche effettuare la cattura di gruppo abbinano solo le lettere con (\w+) essere più specifico.

    Ah grazie per la precisazione.

    OriginaleL’autore mario

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *