Как очистить содержимое iframe с помощью cURL - PullRequest
3 голосов
/ 07 декабря 2011

Цель: я хочу очистить слово "Paris" внутри фрейма с помощью cURL.

Скажем, у вас есть простая страница, содержащая iframe:

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

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

</body>
</html>

Страница iframe:

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

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

</body>
</html>

Мой скрипт cURL:

<?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];

?>

Результат = ничего!

Может кто-нибудь помочь мне узнать столицу Франции ?! ;)

Мне нужен пример:

  1. парсинг / захват URL-адреса iframe
  2. сворачивание URL (как я сделал со страницей index.html)
  3. парсинг для строки "Париж"

Спасибо!

Ответы [ 3 ]

3 голосов
/ 26 июня 2013

обратите внимание, что иногда по разным причинам curl iframe не может быть прочитан вне контекста их собственного сервера, и при просмотре curl напрямую выдается какое-то сообщение об ошибке «not read to прямо или извне».

в этих случаях вы можете использовать curl_setopt ($ ch, CURLOPT_REFERER, $ fullpageurl);(если вы используете php и читаете текст с помощью curl_exec), а затем curl_exec считает, что iframe находится на исходной странице, и вы можете прочитать исходный код.

, так что если по какой-либо причине france.html не может бытьчитать вне контекста большей страницы, которая включала его в качестве iframe, вы все равно можете получить исходный код, используя методы выше, используя CURLOPT_REFERER и установив главную страницу (test / index.html в исходном вопросе) в качестве источника ссылки.

3 голосов
/ 07 декабря 2011

- Edit-- Вы можете загрузить содержимое страницы в строку, проанализировать строку для iframe, а затем загрузить источник iframe в другую строку.

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

Поработайте над вашим коэффициентом принятия (примите ответы на ранее отвеченные вопросы).

URL, для которого вы устанавливаете обработчик скручивания, - это файл, обертывающий i-кадр, попробуйте установить его в качестве URL-адреса iframe:

$url = "http://localhost/test/france.html";
2 голосов
/ 07 декабря 2011

Чтобы ответить на ваш вопрос , ваш шаблон не соответствует введенному тексту:

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

У вас есть дополнительный пробел перед закрывающим тегом абзаца, который никогда не может совпадать:

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

У вас должно быть место перед группой захвата и затем следует удалить лишнюю .:

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

Чтобы использовать дополнительный пробел в любой из двух позиций, используйте \s* вместо:

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

Вы также можете настроить группу захвата только на совпадение букв с (\w+), чтобы быть более точным.

...