我尝试使用以下代码从html页面捕获div的内容:
$result = file_get_contents("http://bo.cope.webtv.flumotion.com/api/active?format=json&podId=78");
$array_full=(json_decode($result, true));
$symbols = array('"','}','{');
$array_full['value'] = str_replace($symbols, "", $array_full['value']);
$array_author_title= explode(",", $array_full['value']);
$array_author = explode(":", $array_author_title[1]);
$array_title = explode(":", $array_author_title[2]);
echo "Author: ".$array_author[1];
echo "</br>Title: ".$array_title[1];
结果为空,因为该代码是由javascript或ajax生成的。 除了使用https://github.com/neorai/php-webdriver之外还有其他方法吗?
解决方案:
np.loadtxt
感谢:@urban和How to use cURL to get jSON data and decode the data?
答案 0 :(得分:0)
此页面加载很奇怪(似乎它正在触发3 loadFinished
个事件!无论如何,以下代码有效:
// "Normal" JS
function waitForMetadata() {
// Initialize global meta
var meta = page.evaluate(function() {
return document.getElementById("metadata_player")
});
var txt = meta.innerHTML;
console.log("meta: '" + meta.outerHTML + "'")
if (txt != "") {
phantom.exit(0);
} else {
setTimeout(waitForMetadata, 1000);
}
}
// PhantomJS
var page = require('webpage').create();
page.open('http://player.rockfm.fm/')
page.onLoadFinished = function(status) {
console.log("Status: " + status);
if(status !== "success") {
console.log("FAIL!")
phantom.exit(1);
}
waitForMetadata();
};
第一部分是一个检查div
内容的函数,如果它是空的,它会自行安排,否则打印和退出。第二部分直接出自phantomJS教程:声明一个页面,注册一个onLoad函数并加载它。
示例输出:
urban@kde-2:/tmp$ phantomjs ./test.js
Status: success
meta: '<div id="metadata_player"></div>'
Status: success
meta: '<div id="metadata_player"></div>'
meta: '<div id="metadata_player"></div>'
meta: '<div id="metadata_player"></div>'
meta: '<div id="metadata_player"></div>'
meta: '<div id="metadata_player"></div>'
meta: '<div id="metadata_player"></div>'
meta: '<div id="metadata_player"></div>'
meta: '<div id="metadata_player">GUNS N' ROSES<br><span id="artist">KNOCKIN' ON HEAVEN'S DOOR</span></div>'
注意:加载内容后,使用JS可以做任何你喜欢的事情(而不是打印)。另外,我想你想稍后使用span id=artist
......
更新1 :
这让我很顽固......我无法用phantomjs
来制作它但是,我检查了这个页面制作的ajax调用,看起来你可以用以下内容播放当前播放的歌曲:
$ curl 'http://bo.cope.webtv.flumotion.com/api/active?format=json&podId=78'
{"id": null, "uuid": "DFLT", "value": "{\"image\": \"\", \"author\": \"AEROSMITH\", \"title\": \"AMAZING\"}"}
这意味着您可以使用您喜欢的任何语言和json_decode
两次:(1)对于包含id
,uuid
和value
以及(2)的外部地图解码value
。我唯一担心的是podId
会发生变化......但似乎是静态的。
希望有所帮助