目标:我想使用 cURL 在 iframe 中抓取单词“Paris”。
假设您有一个包含 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];
?>
结果=什么都没有!
有人可以帮我找出法国的首都吗?! ;)
我需要以下示例:
谢谢!
请注意,有时由于各种原因,iframecurl 无法在其自己的服务器上下文之外读取,并且直接查看curl 会抛出某种类型的“无法直接或外部读取”错误消息。
在这些情况下,您可以使用curl_setopt($ch, CURLOPT_REFERER, $fullpageurl); (如果您在 php 中并使用curl_exec阅读文本),然后curl_exec认为iframe位于原始页面中,您可以阅读源代码。
因此,如果出于某种原因无法在将 france.html 作为 iframe 包含在内的较大页面的上下文之外读取,您仍然可以使用上述方法使用 CURLOPT_REFERER 并设置主页 (test/index.html在原来的问题中)作为推荐人。
--编辑-- 您可以将页面内容加载到字符串中,解析 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);
--原创--
提高您的接受率(接受之前回答过的问题的答案)。
您设置curl处理程序的url是包装i-frame的文件,尝试将其设置为iframe的url:
$url = "http://localhost/test/france.html";
要回答您的正则表达式问题,您的模式与输入文本不匹配:
<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+)
的字母以更加具体。