我有以下结构:
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;
会返回“此文字是评论”
问题是第一种情况有效,它返回“这是普通文本”,但在第二种情况下它不返回任何内容,就好像没有文本一样。 知道这里有什么问题吗?
我需要的是标记为注释的文本(“此文本是注释”)。 非常感谢您的帮助。
答案 0 :(得分:0)
属性不能包含注释。您的问题实际上是XML无效:
<meta name="description" content="<!--This text is a comment-->">
此处的属性以<
字符开头,必须使用实体引用进行转义,例如<
。因为它不是,将其解析为XML应该会导致错误。实际上,这不仅是无效的XML,它还是invalid HTML。您提供的链接doesn't even get passed the first character,顺便说一句。
PHP在这里没有返回任何内容这一事实让我感到惊讶。它使用了引擎盖下的libxml
,这应该会引发错误。你没有说你是如何抓取HTML的。如果您正在使用一些将其转换为XML的抓取工具,则刮刀很可能会更改对象模型以使其成为有效的XML。要确定这是否属实,请将表达式meta[2]
的结果检查为XML片段,也许它删除了无效属性,也许它将注释作为子项放到<meta>
,在这种情况下,您可以通过meta[2]/comment()
来获取它。