【问题标题】:Parsing CDATA from Javascript从 Javascript 解析 CDATA
【发布时间】:2025-12-02 10:50:01
【问题描述】:

这是我的第一篇文章,如果我做错了,我很抱歉,但我们开始吧:

我一直在从事一个应该从网站上抓取价值的项目。这些值是 javascript 数组中的变量。我正在使用PHP Simple HTML DOM,它适用于普通脚本,但不适用于存储在 CDATA 块中的脚本。因此,我正在寻找一种在 CDATA 块中抓取数据的方法。不幸的是,我能找到的所有帮助都是针对 XML 文件的,而我正在从 HTML 文件中抓取。

我试图抓取的 javascript 如下:

<script type="text/javascript">
//<![CDATA[
var data = [{"value":8.41,"color":"1C5A0D","text":"17/11"},{"value":9.86,"color":"1C5A0D","text":"18/11"},{"value":7.72,"color":"1C5A0D","text":"19/11"},{"value":9.42,"color":"1C5A0D","text":"20/11"}];
//]]>
</script>

我需要抓取的是 var 数据中的“值”变量。

问题是我试图替换对象上的 CDATA 字符串。 以下代码完美运行:-)

include('simple_html_dom.php');

$lines = file_get_contents('http://www.virtualmanager.com/players/7793477-danijel-pavliuk/training');

$lines = str_replace("//<![CDATA[","",$lines);
$lines = str_replace("//]]>","",$lines);

$html = str_get_html($lines);

foreach($html->find('script') as $element) {
    echo $element->innertext;
}

如果需要,我会为您提供更多信息。

【问题讨论】:

  • 在将 HTML 文本传递给解析器之前对其进行缓冲,然后搜索并替换以删除 //&lt;![CDATA[//]]&gt; 构造。它们完全没有意义,而且多年来一直如此。
  • 另外:示例 URL 中有奇怪的空格。那是错字吗?因为问题可能是您根本无法加载页面。也就是说,$html-&gt;find('script') 是否还能找到 anything
  • 这是一个错字,我现在已经修正了。我曾尝试删除 CDATA,但随后出现此错误:“致命错误:在...中的非对象上调用成员函数 find()”我已经用我现在正在做的事情更新了帖子。跨度>
  • 你为什么要在 HTML DOM 对象上调用str_replace()?我的意思是,将 HTML 下载到一个字符串中(使用 file_get_contents() 或 curl),然后搜索并替换该字符串,然后 然后 将该字符串解析为 HTML,使用 str_get_html() 代替file_get_html().
  • 哦,我的错。它现在似乎可以工作了:-)

标签: javascript html parsing dom cdata


【解决方案1】:

体面的 HTML 解析器不应该要求将 Javascript 包装在 CDATA 块中。如果他们把它扔掉,只需在解析之前将它们从 HTML 中删除,执行如下操作:

  1. 如果您的主机禁用了该函数中的 HTTP 支持,请使用 file_get_contents()cURL 将 HTML 文件下载到字符串中。
  2. 使用str_replace() 删除//&lt;![CDATA[//]]&gt;
  3. 使用 Simple DOM 的 str_get_html() 从清理后的字符串中解析 HTML
  4. 像以前一样处理 DOM 对象。

【讨论】:

    最近更新 更多