Webページのグループをクロールするアプリケーションを作成しています。ページのソースコード全体を取得するのではなく、すべてのコンテンツを取得して保存し、データベース内にプレーンテキストとしてページを保存できるようにします。コンテンツは他のアプリケーションで使用され、ユーザーが読むことはないため、完全に人間が読めるようにする必要はありません。
当初は正規表現を使うことを考えていましたが、ウェブページの有効性をコントロールできず、正規表現がないとコンテンツが出てしまう可能性が高いです。
文字列内にソースコードがある場合、そのソースコードの文字列をC#のコンテンツだけに変換するにはどうすればよいですか?
何が必要かは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();
HTMLを自分で解析しないでくださいしないでください!標準の正規表現だけを使用してHTMLを解析することはできません。それは不可能です。
そこにはたくさんの無料のライブラリがあります。 .NETの世界で最高の無料のものの1つは、 HTML Agility Pack です。
HTML Agility Packは、不正な形式のドキュメントもサポートします。これは、正規表現やXMLなどの他の基本的な解析ではほとんど機能しません。
以下の関数は、すべてのHTMLタグ、スクリプト、css、スタイルをhtml文字列から削除し、プレーンテキストに変換するのに役立ちます。 ソースを表示
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(" ", string.Empty);
return htmlString;
}
マークアップから生のテキストを取り除き、それを記事に表示するコードを作成しました HTMLをテキストに変換 。提示されたコードは非常にシンプルで軽量です。
また、軽量のHTMLパーサーを作成し、Githubに HTML Monkey として投稿しました。これはより完全な解決策であり、解析されたマークアップを変換してテキストのみを取得するのは簡単な作業です。私はまだこのプロジェクトに取り組んでおり、それがどのように機能するかについてのフィードバックを探しています。