我已经做了这个:
<html>
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
$(document).ready(
function()
{
$("body").html($("#HomePageTabs_cont_3").html());
}
);
</script>
</head>
<body>
<?php
echo file_get_contents("http://www.bankasya.com.tr/index.jsp");
?>
</body>
</html>
当我使用 Firebug 检查我的页面时,它会给出无数"丢失的文件"(图像、css 文件、js 文件等(错误。我只想拥有页面的一部分,而不是全部。这段代码可以执行我想要的操作。但我想知道是否有更好的方法。
编辑:
该页面满足了我的需要。我不需要所有内容。所以iframe
对我来说毫无用处。我只想要div #HomePageTabs_cont_3
的原始数据.
最好的选择是PHP服务器端解析。我写了一个小片段来向您展示如何使用DOMDocument
来做到这一点(如果您的服务器有它,可能会tidy
,以清除所有格式错误的 XHTML foos(。
警告:输出 UTF-8。您可以在 DOMDocument 的构造函数中更改此设置
警告 2:如果其输入既不是 utf-8 也不是 iso-8859-9,则会退出。当前页面的字符集是 iso-8859-9,我认为他们没有理由改变这一点。
header("content-type: text/html; charset=utf-8");
$data = file_get_contents("http://www.bankasya.com.tr/index.jsp");
// Clean it up
if (class_exists("tidy")) {
$dataTidy = new tidy();
$dataTidy->parseString($data,
array(
"input-encoding" => "iso-8859-9",
"output-encoding" => "iso-8859-9",
"clean" => 1,
"input-xml" => true,
"output-xml" => true,
"wrap" => 0,
"anchor-as-name" => false
)
);
$dataTidy->cleanRepair();
$data = (string)$dataTidy;
}
else {
$do = true;
while ($do) {
$start = stripos($data,'<script');
$stop = stripos($data,'</script>');
if ((is_numeric($start))&&(is_numeric($stop))) {
$s = substr($data,$start,$stop-$start);
$data = substr($data,0,$start).substr($data,($stop+strlen('</script>')));
} else {
$do = false;
}
}
// nbsp breaks it?
$data = str_replace(" "," ",$data);
// Fixes for any element that requires a self-closing tag
if (preg_match_all("/<(link|img)([^>]+)>/is",$data,$mt,PREG_SET_ORDER)) {
foreach ($mt as $v) {
if (substr($v[2],-1) != "/") {
$data = str_replace($v[0],"<".$v[1].$v[2]."/>",$data);
}
}
}
// Barf out the inline JS
$data = preg_replace("/javascript:[^;]+/is","#",$data);
// Barf out the noscripts
$data = preg_replace("#<noscript>(.+?)</noscript>#is","",$data);
// Muppets. Malformed comment = one more regexp when they could just learn to write proper HTML...
$data = preg_replace("#<!--(.*?)--!?>#is","",$data);
}
$DOM = new 'DOMDocument("1.0","utf-8");
$DOM->recover = true;
function error_callback_xmlfunction($errno, $errstr) { throw new Exception($errstr); }
$old = set_error_handler("error_callback_xmlfunction");
// Throw out all the XML namespaces (if any)
$data = preg_replace("#xmlns=['"'']?([^'"'']+)['"'']?#is","",(string)$data);
try {
$DOM->loadXML(((substr($data, 0, 5) !== "<?xml") ? '<?xml version="1.0" encoding="utf-8"?>' : "").$data);
} catch (Exception $e) {
$DOM->loadXML(((substr($data, 0, 5) !== "<?xml") ? '<?xml version="1.0" encoding="iso-8859-9"?>' : "").$data);
}
restore_error_handler();
error_reporting(E_ALL);
$DOM->substituteEntities = true;
$xpath = new 'DOMXPath($DOM);
echo $DOM->saveXML($xpath->query("//div[@id='"HomePageTabs_cont_3'"]")->item(0));
按出场顺序:
- 获取数据
- 如果我们有
tidy
,用它清理 HTML - 创建一个新
DOMDocument
并加载我们的文档((string)$dataTidy
是一个速记整理器( - 创建 XPath 请求路径
- 使用 XPath 请求所有 id 设置为我们想要的div,获取集合的第一项(
->item(0)
,这将是一个DOMElement
(,并请求 DOM 输出其 XML 内容(包括标签本身(
希望这是你要找的...尽管您可能希望将其包装在函数中。
编辑
忘了提:http://rescrape.it/rs.php 实际脚本输出!
编辑 2
更正,该站点不是 W3C 有效的,因此,您需要在处理之前将其tidy
或将一组正则表达式应用于输入。我要看看我是否可以制定一套来消除不一致之处。
编辑 3
为我们所有没有tidy
的人添加了修复程序。
编辑 4
无法抗拒。如果您确实想要值而不是表格,请使用以下内容而不是 echo:
$d = new stdClass();
$rows = $xpath->query("//div[@id='"HomePageTabs_cont_3'"]//tr");
$rc = $rows->length;
for ($i = 1; $i < $rc-1; $i++) {
$cols = $xpath->query($rows->item($i)->getNodePath()."/td");
$d->{$cols->item(0)->textContent} = array(
((float)$cols->item(1)->textContent),
((float)$cols->item(2)->textContent)
);
}
我不了解你,但对我来说,数据比格式错误的表格效果更好。
(韦尔普,那个花了一段时间才写(
我会与远程站点的所有者取得联系,询问是否有我可以使用的数据馈送,它只会返回我想要的内容。
塞巴斯蒂安的答案是最好的解决方案,但如果你想使用 jquery,你可以在网站的head
部分添加基本标签,以避免在图像上找不到错误。
<base href="http://www.bankasya.com.tr/">
此外,您还需要将源更改为绝对路径。
但是使用DOMDocument