【问题标题】:Php Parse not working anymorePhp Parse 不再工作了
【发布时间】:2011-02-11 09:47:43
【问题描述】:

我试图从这个页面解析文本,我的方法是 curl 和 dom,但它只是返回一个空白页面。如果有人能告诉我如何做到这一点,将不胜感激。我被困住了,我不知道从这里出发。

【问题讨论】:

  • 您可以从发布您使用的代码开始,这样人们实际上可以尝试找出其中的问题。
  • 如果你解析为 XML,它会失败,因为有很多 xml 错误。解析为 HTML-> de3.php.net/manual/en/domdocument.loadhtml.php

标签: php curl html-parsing


【解决方案1】:

DOM 代码按预期工作。 <span> 没有文本节点:

<span 
    id="ctl00_ctl00_contentPlaceHolder_…_msgTextBody" 
    class="msgBody" 
    style="color:#525B64;"></span>

XPath 返回的DOMNodeList 将为空。如果删除/text() 测试,它将包含&lt;span&gt;DOMElement,这将为nodeValue 返回一个空字符串。

您尝试解析的文本在页面被提供给您的浏览器之后插入到 JavaScript 客户端。使用DOM 获取页面时不会发生这种情况,因为DOM 不是JavaScript 解释器。

您要查找的消息位于&lt;script&gt; 块中。您可以解析该块并尝试使用正则表达式提取它们,例如

$xp = new DOMXpath($dom);
$nodes = $xp->query('//script[contains(., "var messages")]');
preg_match_all(
    '~var messages = (.*\]);~',
    $nodes->item(0)->nodeValue,
    $messages);
$messages = json_decode($messages[1][0]);
var_dump($messages);

上述代码会将 JavaScript 解析并解码为 PHP 对象数组,然后您可以使用 $message-&gt;MessageText 访问这些对象。

http://codepad.viper-7.com/R985hm

【讨论】:

  • @Gordon 哦,我该如何解析这个文本“提醒你 - 这是一个价值 5SB 的代码,直到太平洋标准时间下午 12:25!”它是页面上的主要文本。
  • @Gordon 哇!如果可以的话,谢谢最后一件事?如果我想回显字符串(165)字符串(29),我查看了您提供的链接,我该怎么做?
  • @Dan 这是一个对象数组,因此您可以像访问任何其他数组一样访问它,例如$messages[n] 其中n 是您要获取的对象的数字索引。对象本身是StdClass,因此您看到的任何属性都是公共的。就像访问任何其他公共财产一样访问它们,例如如答案所示。
  • @Gordon 啊,当我尝试收到此错误时,我就是这么想的
  • @Dan 因为您没有获取MessageText 属性,而是尝试回显StdClass。查看格式化的输出。很清楚,不是吗?这是一个包含 50 个元素的数组。每个元素都是一个具有 7 个属性的 stdClass。属性之一是 MessageText。那就是你想要的那个。所以是$message = $messages[n]; echo $message-&gt;MessageText; 或直接echo $messages[n]-&gt;MessageText;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 2014-08-21
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
相关资源
最近更新 更多