Hoe kan ik iframe-inhoud schrapen met behulp van cURL

Doel: ik wil het woord 'Parijs' in een iframe schrapen met cURL.

Stel dat u een eenvoudige pagina met een iframe heeft:

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

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

</body>
</html>

De iframe-pagina:

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

The Capital of France is: Paris

</body> </html>

Mijn 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:(.*?). 

'si", $output, $match); if($match) // 7. Display the scraped string echo "The Capital of France is: ".$match[1]; ?>

Resultaat = niets!

Kan iemand me helpen de hoofdstad van Frankrijk te vinden ?! ;)

Ik heb een voorbeeld nodig van:

  1. parsing/grab the iframe url
  2. curling van de URL (zoals ik heb gedaan met de index.html-pagina)
  3. parsing voor de string "Paris"

Bedankt!

3
Dit is geen cURL-script, het is een PHP-script. Verwar het niet met de bibliotheek. En parseer HTML niet met regex!
toegevoegd de auteur sidyll, de bron
Kun je antwoorden accepteren?
toegevoegd de auteur FailedDev, de bron
Ik zie niet het gedeelte waar u het iframe laadt. U moet eerst de indexpagina schrapen voor alle iframes, en vervolgens laden en schrapen. (ps zoals per deze vraag moet je DOMDocument-> loadHTML() voor HTML-parsing met PHP en geen reguliere expressies)
toegevoegd de auteur CanSpice, de bron
Ik heb zojuist alle antwoorden op mijn vorige vragen geaccepteerd - bedankt dat u erop wees!
toegevoegd de auteur ven, de bron

3 antwoord

--Bewerk-- U kunt de pagina-inhoud in een tekenreeks laden, de tekenreeks voor iframe parseren en vervolgens de iframe-bron in een andere tekenreeks laden.

$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);

--Original--

Werk aan uw acceptatiegraad (accepteer antwoorden op eerder beantwoorde vragen).

De URL waarnaar u de curl-handler wilt instellen, is het bestand waarin het i-frame is ingepakt, en u kunt dit instellen op de URL van het iframe:

$url = "http://localhost/test/france.html";
3
toegevoegd
@Dri: bijgewerkte code om een ​​verandering met $ patroon weer te geven, geef het een kans.
toegevoegd de auteur Mike Purcell, de bron
@Dri: probeer var_dump ($ wrapperPage) nadat het is geïnitialiseerd, kijk of er tenminste inhoud is.
toegevoegd de auteur Mike Purcell, de bron
@Dri: bericht bijgewerkt Kijk of dat werkt.
toegevoegd de auteur Mike Purcell, de bron
@Dri: probeer mijn code, file_get_contents in plaats van uw curl-oproepen. Krul is in dit geval misschien niet nodig. Volgens PHP-documenten kan file_get_contents de inhoud van externe bestanden lezen: us2.php.net/file_get_contents
toegevoegd de auteur Mike Purcell, de bron
nu proberen, maar tegenkomen: Waarschuwing: preg_match() [function.preg-match]: Compilatie mislukt: niets te herhalen op offset 10 in /Applications/XAMPP/xamppfiles/htdocs/curl/1197846/w3.php on line 7 Fatale fout: niet-afgevangen uitzondering 'Uitzondering' met bericht 'Geen overeenkomst gevonden!' in/Applications/XAMPP/xamppfiles/htdocs/curl/1197846/w3.php:10 Stacktracering: # 0 {main} in /Applications/XAMPP/xamppfiles/htdocs/curl/1197846/w3.php gegooid op regel 10
toegevoegd de auteur ven, de bron
<? PHP $ wrapperPage = file_get_contents (' localhost/scrape/index.html '); $ pattern = '/\.*src=\"(*.?)"\.*/'; $ iframeSrc = preg_match ($ pattern, $ wrapperPage, $ matches); if (! isset ($ komt overeen met [0])) {gooi nieuwe uitzondering ('Geen overeenkomst gevonden!'); } $ src = $ komt overeen met [0]; $ src = str_ireplace ('"', '', $ src); $ src = str_ireplace ('src =', '', $ src); $ src = trim ($ src); $ iframeContents = file_get_contents (' localhost/scrape/& # 39 ;. $ src); var_dump ($ iframeContents); echo ($ iframeContents) ;?>
toegevoegd de auteur ven, de bron
Ik probeer je code.
toegevoegd de auteur ven, de bron
Krijg nog steeds een fout boven :(
toegevoegd de auteur ven, de bron
Wanneer ik de iframe-pagina omver te krullen (france.html) werkt alles goed. Ik heb een manier nodig om het eerst naar de index.html te verwijzen - dus ik moet een "krul in een krul doen"
toegevoegd de auteur ven, de bron
umm ... var_dump ($ wrapperPage) werkt prima
toegevoegd de auteur ven, de bron
Ik denk dat het grootste probleem is dat ik niet weet hoe ik de link van het iframe moet schrapen en dat vervolgens moet schrapen! Alle voorbeelden worden op prijs gesteld.
toegevoegd de auteur ven, de bron
ziet eruit alsof dit de iframe-link niet vindt: $ pattern = '/\.*src=\"[a-z]+\.html"\.*/'
toegevoegd de auteur ven, de bron
indexcode:

Wat is de hoofdletter van Frankrijk?

<iframe src = " localhost/scrape/france.html & quot ; title = "test" name = "test">
toegevoegd de auteur ven, de bron
toegevoegd de auteur ven, de bron

merk op dat de iframe-curl om verschillende redenen soms niet buiten de context van hun eigen server kan worden gelezen en als u naar de krul kijkt, wordt direct een bepaald type 'niet direct of extern te lezen' foutbericht gegenereerd.

in deze gevallen kunt u curl_setopt ($ ch, CURLOPT_REFERER, $ fullpageurl) gebruiken; (als u in PHP bent en de tekst leest met curl_exec) en dan denkt curl_exec dat het iframe zich op de originele pagina bevindt en kunt u de bron lezen.

dus als, om welke reden dan ook, france.html niet gelezen kon worden buiten de context van de grotere pagina die het als een iframe bevatte, kan je de bron nog steeds gebruiken via bovenstaande methoden met CURLOPT_REFERER en de hoofdpagina instellen (test/index.html in de oorspronkelijke vraag) als de verwijzer.

3
toegevoegd
of stel gewoon CURLOPT_AUTOREFERER in
toegevoegd de auteur nurettin, de bron

Als u uw -vraag wilt beantwoorden, komt uw patroon niet overeen de invoertekst:

          

The Capitol of France is: Paris

U heeft een extra spatie voor de afsluitende alineatags, die nooit hetzelfde kan zijn:

preg_match("'The Capitol of France is:(.*?). 

'si"

U moet de spatie voor de capture-groep hebben en daarna de overtollige . verwijderen:

preg_match("'The Capitol of France is: (.*?)

'si"

Als u de optionele ruimte op een van de twee posities wilt gebruiken, gebruikt u in plaats daarvan \ s * :

preg_match("'The Capitol of France is:\s*(.*?)\s*

'si"

U kunt de capture-groep ook alleen laten overeenkomen met letters met (\ w +) om specifieker te zijn.

2
toegevoegd
Ah, bedankt dat je dit wees.
toegevoegd de auteur ven, de bron