2015-09-08 15 views
1

我有以下結構:PHP:在META標籤刮意見不工作

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

你會說,使用像使用XPath刮:

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

將返回「這是正常的文本「

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

會返回「This text is a comment」

問題是,第一種情況下,它返回「這是正常的文本」,但在第二種情況下,它沒有返回任何東西,就好像沒有文本。 任何想法這裏有什麼問題?

我需要的是標記爲評論(「此文本是評論」)的文本。 希望你的幫助。

+0

當您引用: - 「但在第二種情況下,它不返回任何內容,就好像沒有文本。」如果沒有文本,那麼它將不會返回文本 –

+0

我已經嘗試了您的代碼,它給了我完美<! - 此文本是對第二個元標記的註釋 - >。你的第二個元標記包含<! - 這個文本是一個評論 - >不是<! - 這個文本是一個評論 - > –

+0

重點是,在我的真實生活的例子中,有文字...我認爲可能是因爲文本被標記爲註釋,它不可讀... – Guitr

回答

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()與該屬性對應。