PHP:在META标记中抓取注释不起作用

时间:2015-09-08 05:54:28

标签: php xpath screen-scraping meta-tags

我有以下结构:

int i;

你会说使用类似的东西使用XPath进行抓取:

<body>
   <meta name="keywords" content="This is normal text">
   <meta name="description" content="<!--This text is a comment-->">
<body>

会返回“这是正常文字”

$meta = $XPath->query ( '//body/meta[1]/@content' ); 
$meta = $meta->item(0)->nodeValue;

会返回“此文字是评论”

问题是第一种情况有效,它返回“这是普通文本”,但在第二种情况下它不返回任何内容,就好像没有文本一样。 知道这里有什么问题吗?

我需要的是标记为注释的文本(“此文本是注释”)。 非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

属性不能包含注释。您的问题实际上是XML无效:

<meta name="description" content="<!--This text is a comment-->">

此处的属性以<字符开头,必须使用实体引用进行转义,例如&lt;。因为它不是,将其解析为XML应该会导致错误。实际上,这不仅是无效的XML,它还是invalid HTML。您提供的链接doesn't even get passed the first character,顺便说一句。

PHP在这里没有返回任何内容这一事实让我感到惊讶。它使用了引擎盖下的libxml,这应该会引发错误。你没有说你是如何抓取HTML的。如果您正在使用一些将其转换为XML的抓取工具,则刮刀很可能会更改对象模型以使其成为有效的XML。要确定这是否属实,请将表达式meta[2]的结果检查为XML片段,也许它删除了无效属性,也许它将注释作为子项放到<meta>,在这种情况下,您可以通过meta[2]/comment()来获取它。