2011-12-19 64 views
1

我有以下的html,我使用php的DomDocument類來獲取腳本標記旁邊id爲'nextPageBtn'的元素。問題是我的查詢不會返回任何東西(就像沒有指定id的元素一樣)。繼承人我解析的HTML。得到一個元素使用php DomDocument

<body> 
    <div style='float:left'><img src='../../../../includes/ph1.jpg'></div> 

    <label style='width: 476px; height: 40px; position: absolute;top:100px; left: 40px; z-index: 2; background-color: rgb(255, 255, 255);; background-color: transparent' > 
    <font size="4">1a. Nice to meet you!</font> 
    </label> 
    <img src='ENG_L1_C1_P0_1.jpg' style='width: 700px; height: 540px; position: absolute;top:140px; left: 40px; z-index: 1;' /> 

    <script type='text/javascript'> 


    swfobject.registerObject('FlashID'); 
    </script> 

    <input type="image" id="nextPageBtn" src="../../../../includes/ph4.gif" style="position: absolute; top: 40px; left: 795px; "> 

    </body> 

和繼承人的PHP代碼來解析它。

$doc->loadHTMLFile($path); 

    $doc->encoding='UTF-8'; 
    $x = new DOMXPath($doc); 
$nextPage=$x->query("//*[@id='nextPageBtn']")->item(0); 
if($nextPage) 
    { 

    echo 'found it..'; 
} 

我認爲「線swfobject.registerObject(」 FlashID「)」被產生某種其避免了元件的錯誤被發現?

+0

您的xpath表達式乍看起來看起來有效。 - 還有其他代碼。無法重現:http://codepad.viper-7.com/RUNGOd - 可能是你看錯了地方。 '$ doc-> encoding ='UTF-8';'對我來說看起來是多餘的。 – hakre 2011-12-19 11:29:04

+0

如果你能夠編輯你正在處理的文件的標記,我會建議給你想要抓取的元素添加一個ID,然後getElementById()它。 – GordonM 2011-12-19 11:33:38

+0

@GordonM說:如果XHTML有一個[DTD](http://en.wikipedia.org/wiki/Document_Type_Definition),它指定了[ID屬性](http://www.theukwebdesigncompany.com/articles/xml) -id-idref-dtd.php),'getElementById'工作。 – hakre 2011-12-19 11:43:07

回答

1

正如評論中所寫,您的代碼完美無瑕。演示:http://codepad.viper-7.com/RUNGOd

你考慮哪些問題來源:

我覺得行「swfobject.registerObject(」 FlashID「)」正在產生某種這是避免元素的錯誤被發現?

幾乎可以是一個爲DOMDocument::loadHTMLFile應處理在加載文檔的所有標籤(否則你會收到錯誤/警告。載荷已經完成後,DOMDocument已經標準化的數據訪問,所以沒有這樣的問題(如果在libxml中沒有bug,底層庫,但幾乎沒有這樣一個普通的東西)。

那麼這裏有什麼選擇?可能HTML不是你想象的HTML。如果在你的情況下加載HTML失敗。加載時檢查錯誤:

error_reporting(~0); ini_set('display_errors', 1); 

而且驗證的HTML是你認爲裝車後HTML:

$doc->loadHTMLFile($path); 
echo $doc->saveHTML(); 

將輸出「源」。

還要檢查你的libxml版本:

printf("LIBXML version: %s\n", LIBXML_DOTTED_VERSION); 

libxml的是底層庫PHP的DOMDocument的基礎上的。根據版本,可能會有錯誤,並不是所有功能都能正常工作。例如,getElementById函數不適用於loadHTMLFile/loadHTML版本2.6.26,但它的版本號爲2.7.7(您正在使用的XPath表達式不受這兩個版本的影響)。

如果您在此遇到編碼問題(源文件的編碼超出預期),很難告訴您提供的信息。內部DOMDocument的默認編碼是UTF-8在PHP,所以設置:

$doc->encoding='UTF-8'; 

加載了文件看起來是多餘的我了。也許你應該刪除它以減少代碼,以便更容易地找到錯誤來自的地方(就像我在演示中所做的那樣)。

+0

謝謝hakre ...發現問題是UTF-8 ...刪除它現在一切都很好! – samach 2011-12-19 12:29:20