【问题标题】:Get dynamic content from HTML从 HTML 获取动态内容
【发布时间】:2017-11-10 15:59:20
【问题描述】:

我正在尝试使用以下代码从 html 页面中捕获 div 的内容:

$content = file_get_contents('http://player.rockfm.fm/');

$content = preg_replace("/\r\n+|\r+|\n+|\t+/i", " ", $content);

preg_match('/<div id=\"metadata_player\">(.*?)<\/div>/', $content , $matchs);

print_r($matchs);

结果为空,因为该代码是由 javascript 或 ajax 生成的。 除了使用https://github.com/neorai/php-webdriver,还有其他方法吗?

解决方案:

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

感谢:@urban 和 How to use cURL to get jSON data and decode the data?

【问题讨论】:

  • 为什么不使用 Javascript 捕获它!见phantomjs
  • 扔掉这个$content = preg_replace("/\r\n+|\r+|\n+|\t+/i", " ", $content);把这个'/&lt;div id=\"metadata_player\"&gt;(.*?)&lt;\/div&gt;/'改成'/(?s)&lt;div\s+id\s*=\s*"metadata_player"\s*&gt;(.*?)&lt;\/div\s*&gt;/'

标签: php json regex curl


【解决方案1】:

这个页面加载很奇怪(似乎它正在触发 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_decodetwice:(1) 用于具有iduuidvalue 的外部地图和(2) 解码value。我唯一担心的是podId 是否发生变化……但似乎是静态的。

希望对你有帮助

【讨论】:

  • 我尝试了同样的方法,但没有使用 waitForMetadata 函数,并且出现此错误:“VIDEOJS: ERROR: (CODE: 4 MEDIA_ERR_SRC_NOT_SUPPORTED) Not compatible source was found for this media. [Object Object]” 我有尝试使用您的解决方案,我得到了同样的错误,但如果我可以看到空的 div 但我从来没有得到内容,我等了 4 分钟。
  • 嗨@rai,phantomjs 版本似乎有问题。现在尝试使用不同的版本,我得到 jQuery 错误($ 未定义)...
  • http://bo.cope.webtv.flumotion.com/api/active?format=json&amp;podId=78 怎么样?应该给你你不需要的东西吗?
  • 是的,工作 :) 我昨天在寻找如何获取 post json 代码,我唯一缺少的是 url。我在看firefox->检查代码->网络->响应,我没有通过头部获取url,失败了哈哈哈现在我将编辑并提出解决方案
猜你喜欢
  • 2012-01-21
  • 2016-09-04
  • 2012-07-04
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 2017-09-03
  • 1970-01-01
相关资源
最近更新 更多