2010-10-08 73 views
2

我試圖從無效HTML網站刮取數據。 Simple HTML DOM Parser解析它,但由於它處理無效的HTML如何丟失一些信息。帶有DOMXPath的內置DOM解析器不起作用,它返回一個空白結果集。我能夠通過PHP Tidy運行獲取的HTML後在本地工作(DOMDocument和DOMXPath),但PHP Tidy未安裝在服務器及其共享託管服務器上,所以我無法控制這一點。我試過HTMLPurifier,但這似乎只是爲了確保用戶輸入,因爲它完全刪除了doctype,head和body標籤。如何使用無效HTML刮掉網站

是否有任何種類的獨立替代PHP Tidy?我真的更喜歡使用DOMXPath瀏覽並獲取我需要的東西,它似乎需要一些幫助清理HTML,然後才能解析它。

編輯:我刮這個網站:http://courseschedules.njit.edu/index.aspx?semester=2010f。現在我只是試圖獲得所有的課程鏈接。

+0

什麼網站你刮? – Stephen 2010-10-08 18:48:29

+0

[解析HTML的最佳方法]的可能重複(http:// stackoverflow。com/questions/3577641/best-methods-to-parse-html) – Gordon 2010-10-08 21:29:34

+2

這篇文章實際上有我需要的。 PHPQuery完成了這項工作。 – Telanor 2010-10-08 23:55:12

回答

6

DOM處理碎HTML罰款:

$dom = new DOMDocument; 
libxml_use_internal_errors(TRUE); 
$dom->loadHTMLFile('http://courseschedules.njit.edu/index.aspx?semester=2010f'); 
libxml_clear_errors(); 

$xPath = new DOMXPath($dom); 
$links = $xPath->query('//div[@class="courseList_section"]//a'); 
foreach($links as $link) { 
    printf("%s (%s)\n", $link->nodeValue, $link->getAttribute('href')); 
} 

將輸出

ACCT - Accounting (index.aspx?semester=2010f&subjectID=ACCT) 
AD - Art and Design (index.aspx?semester=2010f&subjectID=AD ) 
ARCH - Architecture (index.aspx?semester=2010f&subjectID=ARCH) 
... many more ... 
TRAN - Transportation Engr (index.aspx?semester=2010f&subjectID=TRAN) 
TUTR - Tutoring (index.aspx?semester=2010f&subjectID=TUTR) 
URB - Urban Systems (index.aspx?semester=2010f&subjectID=URB) 

foreach迴路將輸出使用

echo $dom->saveXML($link), PHP_EOL; 

充分outerHTML鏈接。

+0

這比Simple DOM DOM Parser稍微好一些,但如果您計算結果,它只會給出123個鏈接中的107個。 – Telanor 2010-10-08 23:33:43

+0

@Telanor更新。 XPath現在搜索* div class中的所有鏈接,而類名爲courseList_section *,而不是* divs *內跨度內的所有鏈接。我很確定你可以很容易地解決這個問題。還有可能''// a [ancestor :: div [@ class =「courseList_section」]]'' – Gordon 2010-10-09 08:36:11

+0

你是對的,它現在可以工作。我仍然不確定我沒有試過這個。這實際上是我在運行Tidy後本地使用的XPath查詢 – Telanor 2010-10-09 18:45:55

0

如果您知道錯誤,您可能會應用一些正則表達式來專門修復它們。雖然這種臨時解決方案看起來很髒,但實際上可能會更好,好像HTML確實格式不正確,但自動推斷正確的解釋可能會很複雜。

編輯:其實它可能會更好,只是通過正則表達式提取所需的信息,因爲頁面有很多錯誤,這將是很難或至少繁瑣的修復。

+1

-1。它看起來很髒,因爲它很難維護。 – TrueWill 2011-09-09 18:16:53

0

是否有一個Web服務可以通過Tidy運行你的內容?你能寫一個嗎? Tidy是我知道修理破碎標記的唯一理智方式。如果你使用loadHTMLloadHTMLFile

0

考慮使用真正的瀏覽器或網頁瀏覽器控件。我測試了iMacrosweb scraping效果很好。前兩個鏈接的測試宏:

VERSION BUILD=7050962 
URL GOTO=http://courseschedules.njit.edu/index.aspx?semester=2010f 
'Get text 
'TAG POS=2 TYPE=A FORM=ID:form1 ATTR=TXT:*-* EXTRACT=TXT 
'Get link first entry 
TAG POS=2 TYPE=A FORM=ID:form1 ATTR=TXT:*-* EXTRACT=HREF 
'Get link second entry 
TAG POS=3 TYPE=A FORM=ID:form1 ATTR=TXT:*-* EXTRACT=HREF 

您可以通過遞增POS =值在條目之間移動。

0

解決問題的另一個簡單方法可能是將您試圖通過移動瀏覽器適配器程序包(例如Google複雜網站的移動瀏覽器)掃描的網站傳遞給您。這將糾正無效的html,並使您能夠使用簡單的html dom解析器包,但如果您需要刪除站點中的某些信息,它可能無法正常工作。這個適配器的鏈接如下。我將其用於信息格式不正確的網站,或者如果我需要一種簡化格式的方法,以便於分析。谷歌動員返回的HTML更簡單,更容易處理。

http://www.google.com/gwt/n