[英]Find important text in arbitrary HTML using PHP?
我有一些隨機的HTML布局,其中包含我想要提取的重要文本。 我不能只是strip_tags()
因為它會從側邊欄/頁腳/標題/等中留下一堆額外的垃圾。
我發現了一個用Python構建的方法 ,我想知道在PHP中是否有這樣的東西。
這個概念相當簡單:如果一行文本值得輸出,請使用有關文本密度與HTML代碼的信息。 (這不是一個新穎的想法,但它有效!)基本過程的工作原理如下:
- 解析HTML代碼並跟蹤處理的字節數。
- 以每行或每段為基礎存儲文本輸出。
- 將每個文本行與描述它所需的HTML字節數相關聯。
- 通過計算文本t> o字節的比率來計算每行的文本密度。
- 然后通過使用神經網絡確定該行是否是內容的一部分。
只需檢查線路的密度是否高於固定閾值(或平均值),您就可以獲得相當不錯的結果,但如果您使用機器學習,系統會減少錯誤 - 更不用說它更容易實現了!
更新:我開始獲得一個可以從隨機HTML模板中提取主要內容的答案。 由於我無法共享我將使用的文檔 - 只需選擇任意隨機博客網站並嘗試從布局中提取正文。 請記住,標題,側邊欄和頁腳也可能包含文本。 請參閱上面的鏈接以獲取建議。
- phpQuery是一個基於jQuery JavaScript庫的服務器端,可鏈接,CSS3選擇器驅動的文檔對象模型(DOM)API。
更新2
- 演示: http : //so.lucafilosofi.com/find-important-text-in-arbitrary-html-using-php/
- 在 2010年 Technorati Top 100 和 Best Blogs的 休閑博客列表中進行了測試
#sidebar, #header, #footer, #comments, etc..
script, iframe
避免任何小部件 /\\d+\\scomment(?:[s])/im
/(read the rest|read more).*/im
/(?:.*(?:by|post|submitt?)(?:ed)?.*\\s(at|am|pm))/im
/[^a-z0-9]+/im
搜索熟悉的類和ID:
.entry-content
.post-entry .entry .post
.post
.post-body .entry-content
.content
.post
.journal-entry-text
.entry
gawker.com .post-body
參考: 前100名博客中選擇的博客平台
$selectors = array('.post-body','.post','.journal-entry-text','.entry-content','.content');
$doc = phpQuery::newDocumentFile('http://blog.com')->find($selectors)->children('p,div');
基於常見的html結構搜索,如下所示:
<div>
<h1|h2|h3|h4|a />
<p|div />
</div>
$doc = phpQuery::newDocumentFile('http://blog.com')->find('h1,h2,h3,h4')->parent()->children('p,div');
Domdocument可用於解析html文檔,然后可以通過PHP查詢。
編輯:wikied
我不久前在一個類似的項目上工作過。 它沒有Python腳本那么復雜,但它會做得很好。 查看Simple HTML PHP Parser
根據您的HTML結構,如果您有id或類,您可能會有點復雜,並使用preg_match()專門獲取特定開始和結束標記之間的任何信息。 這意味着您應該知道如何編寫正則表達式。
您還可以查看瀏覽器仿真PHP類。 我已經為頁面抓取做了這個,它的工作原理很好,具體取決於DOM的格式。 我個人喜歡SimpleBrowser
http://www.simpletest.org/api/SimpleTest/WebTester/SimpleBrowser.html
我開發了一個HTML解析器和過濾PHP包,可用於此目的。
它由一組可以鏈接在一起的類組成,以便在HTML / XML代碼中執行一系列解析,過濾和轉換操作。
它旨在處理真實世界頁面,因此它可以處理格式錯誤的標記和數據結構,因此它可以盡可能多地保留原始文檔。
它附帶的一個過濾器類可以進行DTD驗證。 另一個可以丟棄不安全的HTML標簽和CSS來防止XSS攻擊。 另一個可以簡單地提取所有文檔鏈接
所有這些過濾器類都是可選的。 如果您需要,可以按照自己的方式將它們鏈接在一起。
因此,為了解決您的問題,我認為在任何地方都沒有針對PHP的特定解決方案,但可以為它開發一個特殊的過濾器類。 看看包裝。 它是完整的文件。
如果您需要幫助,只需檢查我的個人資料並給我發郵件,我甚至可以開發出能夠滿足您需求的過濾器,最終受到其他語言存在的任何解決方案的啟發。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.