2016-12-06 27 views
1

我有外部HTML網站,我需要從該網站的表中提取數據。然而,HTML網頁的來源有誤格式化,除了在碼錶,所以我不能使用提取部分代碼並在bash中解析HTML

xmllint --html --xpath <xpath> <file> 

,因爲它不能正常工作,當HTML格式的網站上被打破了。

我的想法是使用curl和刪除表格上方和下方的代碼。當提取表時,代碼是乾淨的,它適合於xmllint工具(我可以使用xpath)。然而,刪除上面的所有內容對於shell來說都具有挑戰性,你可以在這裏看到:Sed doesn't backtrack: once it's processed a line, it's done. 有沒有一種方法如何僅從bash中的HTML網站中提取表的代碼? Suposse,代碼具有這種結構。

<html> 
<head> 
</head> 
<body> 
<p>Lorem ipsum ....</p> 
    <table class="my-table"> 
    <tr> 
     <th>Company</th> 
     <th>Contact</th> 
    </tr> 
    </table> 
<p>... dolor.</p> 
</body> 
</html> 

我需要這樣的輸出正確地解析數據:

<table class="my-table"> 
    <tr> 
     <th>Company</th> 
     <th>Contact</th> 
    </tr> 
    </table> 

請不要給我減的,因爲試圖使用bash。

+0

您可以檢查此文章: http://www.joyofdata.de/blog/using-linux-shell-web-scraping/ – Hackerman

+0

您是否嘗試過使用HTML-Tidy清理HTML http://www.html-tidy.org/ –

+0

我試過「 tidy -ashtml page.html -output page2.html「但不幸的是,它返回」在使用HTML Tidy生成整理版本之前,必須修復此文檔的錯誤。「它需要完全自動化。不管怎樣,謝謝。@ Dan-Dev –

回答

3

我會打破我嘗試使用xmllint它支持--html標誌通過解析它低於該分析html文件

首先你可以檢查你的HTML文件的理智的回答確認,如果該文件是爲按照標準,或者看到拋出的錯誤: -

$ xmllint --html YourHTML.html 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html> 
<head> 
</head> 
<body> 
<p>Lorem ipsum ....</p> 
    <table class="my-table"> 
    <tr> 
     <th>Company</th> 
     <th>Contact</th> 
    </tr> 
    </table> 
<p>... dolor.</p> 
</body> 
</html> 

我原來的YourHTML.html文件只是被你的問題輸入HTML文件。

現在的值提取部分: -

啓動文件從根節點解析到的table節點(//html/body/table)和HTML解析器&交互shell模式(xmllint --html --shell

運行運行xmllint該命令明顯產生結果,

$ echo "cat //html/body/table" | xmllint --html --shell YourHTML.html 
/> ------- 
<table class="my-table"> 
    <tr> 
     <th>Company</th> 
     <th>Contact</th> 
    </tr> 
    </table> 
/> 

現在使用sed刪除特殊字符即sed '/^\/ >/d'生產

$ echo "cat //html/body/table" | xmllint --html --shell YourHTML.html | sed '/^\/ >/d' 
<table class="my-table"> 
    <tr> 
     <th>Company</th> 
     <th>Contact</th> 
    </tr> 
    </table> 

這是您所期望的輸出結構。測試在xmllint: using libxml version 20900

我往前走了一步,如果你想獲取table標籤內的值,你可以將sed命令以將這些提取物作爲

$ echo "cat //html/body/table" | xmllint --html --shell YourHTML.html | sed '/^\/ >/d' | sed 's/<[^>]*.//g' | xargs 
Company Contact 
+0

當HTML有效並且沒有被破壞時,此代碼完美工作。但我不能在我的情況下適用這個(對於簡化的誤導性示例抱歉)。顯然,很多網頁沒有有效的html代碼,所以它不允許我從它們解析數據。假設只有有效的代碼在表格內。不幸的是,我必須承認,bash並不真正適合於提取不遵循W3C標準的網頁上的部分代碼。你知道任何選項如何提取不同的表? –

+0

我發現畢竟,這個解決方案完全符合@ Dan-Dev的建議,可以通過選項force-output來使用整齊:yes –