2010-01-10 71 views
8

我正在編寫一個應用程序來抓取我的一組網頁。我不想採用整個頁面的源代碼,而是想把所有的內容都存儲起來並存儲起來,並且能夠將頁面作爲純文本存儲在數據庫中。該內容將用於其他應用程序,而不是由用戶閱讀,因此不需要它是完全人性化的。解析HTML以獲取使用C#的內容

起初,我正在考慮使用正則表達式,但我無法控制網頁的有效性,並且很有可能沒有正則表達式會給我內容。

如果我有一個字符串內的源代碼,我該如何將該源代碼字符串轉換爲C#中的內容?

+0

定義「只是內容」...所有的html都是內容,所以你可以只存儲html。你的意思是「只是文字,沒有標記」?或者是什麼? – 2010-01-10 18:51:53

+0

爲什麼不用「XML」解析它們? ,這樣你可以讀取節點並決定只取內容......但是我不確定XML解析是否可以讀取自閉標籤。 – 2010-01-10 18:53:29

+0

XML支持自閉標籤,但不幸的是許多所謂的HTML文檔不幸的是包含許多格式不正確的標籤 – Eilon 2010-01-10 18:53:59

回答

15

它不是100%清楚你想要什麼,但我假設你想要文本減去標記;所以:

string html; 
// obtain some arbitrary html.... 
using (var client = new WebClient()) { 
    html = client.DownloadString("http://stackoverflow.com/questions/2038104"); 
} 
// use the html agility pack: http://www.codeplex.com/htmlagilitypack 
HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(html); 
StringBuilder sb = new StringBuilder(); 
foreach (HtmlTextNode node in doc.DocumentNode.SelectNodes("//text()")) { 
    sb.AppendLine(node.Text); 
} 
string final = sb.ToString(); 
+0

這看起來很完美,非常感謝! – 2010-01-10 19:01:21

+0

當我使用此代碼解析搜索文本的谷歌主頁時,我所得到的就是噸的JavaScript。無論如何要避免這一點? – 2013-08-21 09:39:28

+0

@WinCoder:這是如何從頁面內容中刪除JavaScrip和CSS:http://stackoverflow.com/questions/13441470/htmlagilitypack-remove-script-and-style – user1892410 2015-06-04 20:22:46

7

請你做不是你自己解析HTML!你不能使用標準的正則表達式來解析HTML - 這是不可能的。

有大量的免費圖書館。 .NET世界中最好的免費軟件之一是HTML Agility Pack

HTML Agility Pack也支持格式不正確的文檔,這是正則表達式或其他基本解析(如XML幾乎不會執行的操作)。

2

以下功能將有助於從HTML字符串中移除所有的HTML標籤,腳本,CSS樣式,並將其轉換爲純文本。 view source

private string GetPlainTextFromHtml(string htmlString) 
{ 
    string htmlTagPattern = "<.*?>"; 
    var regexCss = new Regex("(\\<script(.+?)\\</script\\>)|(\\<style(.+?)\\</style\\>)", RegexOptions.Singleline | RegexOptions.IgnoreCase); 
    htmlString = regexCss.Replace(htmlString, string.Empty); 
    htmlString = Regex.Replace(htmlString, htmlTagPattern, string.Empty); 
    htmlString = Regex.Replace(htmlString, @"^\s+$[\r\n]*", "", RegexOptions.Multiline); 
    htmlString = htmlString.Replace("&nbsp;", string.Empty); 

    return htmlString; 
} 
0

我寫代碼來剔除從標記的原始文本,並在我的文章Convert HTML to Text出示。所提供的代碼非常簡單和輕量級。

我還寫了一個輕量級的HTML解析器,並將它發佈到Github上作爲HTML Monkey。這將是一個更完整的解決方案,將解析標記轉換爲僅獲取文本將是一項簡單的任務。我仍在研究這個項目,並且正在尋找關於它如何工作的反饋。