2009-12-29 47 views
3

我有一個美國國會議員的網站列表,我以編程方式抓取地址。許多網站的底層標記有所不同,但直到我開始看到數百個網站沒有爲我寫的腳本提供預期結果時,這個問題一開始並不成問題。當strip_tags()燒燬乾草堆

在花了一些時間來評估潛在原因後,我發現file_get_contents()的結果strip_tags()被多次擦除了頁面的大部分來源!這不僅僅是刪除HTML,而是刪除了我想要刮掉的非HTML!

所以我刪除了電話strip_tags(),用一個調用來取消所有非字母數字字符,並給該過程另外一次運行。它出現了其他的結果,但仍然缺乏很多。這一次是因爲我的正則表達式不符合所需的模式。查看返回的代碼後,我意識到我在整個文本中散佈了HTML屬性的殘餘部分,打破了我的模式。

有沒有辦法解決?它是HTML格式不正確的結果嗎?我能做些什麼嗎?

回答

5

有PHP手冊警告,上面寫着:

因爲用strip_tags()實際上並不 驗證HTML,局部的,或可能導致刪除的詳細 文本/數據比破 標籤預期。

既然你刮許多不同的網站,你可以不佔他們的HTML的有效性,這將永遠是一個問題。不幸的是,正則表達式不會爲你做,如regexps simply aren't cut out to be document parsers

我會使用類似PHP Simple HTML DOM Parser,甚至內置DOMDocument->loadHTML()方法。

您可以保留一個小型數據庫,記錄您想要刮取的每個頁面以及在該頁面結構中找到信息的位置。每次你抓取它時,你都可以做一個快速檢查,看看結構是否發生了變化,在這種情況下,你可以使用DOM解析器的新路徑位置來更新數據庫,並在下一次抓取時獲取它。