2011-02-02 108 views
1

我想要檢索位於此span類屬性中的正文文本。使用DOM解析PHP(無結果)

<span id="" style="color:#525B64;">The quick brown fox jumped over the lazy dog.</span> 

我在我的網絡服務器上測試過它,我沒有收到任何錯誤,但是網頁是空白的。我對此很陌生,所以我不知道該從哪裏出發。

這是我的代碼。

<?php 
// Load remote file, supress parse errors 
libxml_use_internal_errors(TRUE); 
$dom = new DOMDocument; 
$dom->loadHTMLFile('http://somewebpage.com'); 
libxml_clear_errors(); 

// use XPath to find all nodes with a class attribute of header 
$xp = new DOMXpath($dom); 
$nodes = $xp->query('//span[@class="msgBody"]'); 

// output first item's content 
echo $nodes->item(0)->nodeValue; 
?> 
+0

什麼是您試圖訪問的實際頁面?據我所知,此代碼有效。 – lonesomeday 2011-02-02 01:24:51

回答

3

在此代碼中一切看起來不錯。

我想嘗試做的是:

  • 除去supresses解析錯誤的行。
  • 負載看到file_get_contents遠程文件,如果使用XPath正確加載
  • 查詢文檔一樣//*和遍歷導致DOMNodeList(用foreach),看看樹是否正確建立。

Btw。爲了抑制由->loadHTMLFile()方法報告的解析錯誤,我使用了@運算符。

+1

個人來說,爲了抑制loadHTMLFile()報告的解析錯誤,我修復了錯誤。 ;-) – Wiseguy 2011-02-02 01:27:52

+0

Wiseguy,你無法修復你正在解析的遠程文檔上的錯誤... – mateusza 2011-02-02 01:29:22

+0

嗯,這是一個公平的陳述。感謝您在我的閱兵式上下雨。 – Wiseguy 2011-02-02 01:30:18

1

DOM爲everthing創建節點:屬性,文本,註釋,元素,您將其命名。因此,即使看起來像這樣,你並沒有看到跨度節點的值,但實際上你希望在該跨度內獲得TextNode,並取而代之爲值。嘗試是這樣的:

echo $nodes->item(0)->childNodes->item(0)->nodeValue 

您也可以直接從XPath查詢得到這樣的:

$nodes = $xp->query('//span[@class="msgBody"]/text()'); 

(雖然我從來沒有使用XPath多少運氣,個人)

1

你確定在你正在解析的文檔中,這個類只有一個span元素?

也許->item(0)返回空元素,所需的元素是下一個列表?

1

很多時候,這種行爲是由於默認命名空間(請檢查是否有類似於此的:xmlhs="http://www.w3.org/1999/xhtml")。

在XPath表達式中使用默認名稱空間中的元素名稱是xpath標記中最常見的FAQ - 只需搜索「xpath默認名稱空間」即可找到許多好的答案。