2011-07-09 28 views
14

我想從表中獲取數據而不使用正則表達式。我喜歡使用simplexml來解析RSS提要,並想知道它是否可以用來從另一個頁面獲取表格。simplexml可以用來通過html來竄?

例如,用curl或簡單的file_get_contents()來抓取頁面;那麼使用simplexml來抓取內容?

回答

27

可以使用loadHTML功能從DOM模塊,然後導入DOM轉換成SimpleXML通過simplexml_import_dom

$html = file_get_contents('http://example.com/'); 
$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$sxml = simplexml_import_dom($doc); 
+1

大+1。添加了一個'simplexml_import_dom'的鏈接和一些進一步的解釋。 –

+0

非常好的技巧。不幸的是,它看起來像我正在工作的服務器上沒有安裝DOM模塊。它是典型的標準嗎? – chris

+0

默認情況下,@chris DOM及其依賴項libxml都被編譯。它們可以在編譯時明確排除或在運行時禁用,但這非常不尋常。 – phihag

7

如果這是XHTML - 是的,這絕對有可能。真正的XHTML最終只是XML,因此可以使用XML解析器進行分析。

但是,SimpleXML只接受嚴格的XML。如果不能得到有效的XHTML,它看起來像把它通過不太嚴格DOMDocument庫首先會做的伎倆(source here):

<?php 
    $html = file_get_contents('http://...'); 
    $doc = new DOMDocument(); 
    $doc->strictErrorChecking = FALSE; 
    $doc->loadHTML($html); 
    $xml = simplexml_import_dom($doc); 
?> 
0

它可能依賴於頁面。如果頁面在XHTML中(現在是大多數Web頁面),那麼任何XML解析器都應該這樣做,否則查找SGML解析器。這裏有一個類似的問題,你可能有興趣Error Tolerant HTML/XML/SGML parsing in PHP

+1

MOST網頁?該數據的來源?另外,請仔細研究SO(或一般互聯網),以瞭解爲什麼人們通常無法正確使用XHTML。 – Mchl

1

我的版本 - 耐錯誤和問題與編碼

libxml_use_internal_errors(true); 
$doc = new DOMDocument(); 
$doc->strictErrorChecking = FALSE; 
$doc->loadHTML(mb_convert_encoding($this->html_content, 'HTML-ENTITIES', 'UTF-8')); 
libxml_use_internal_errors(false); 
$xml = simplexml_import_dom($doc); 
相關問題