web-dev-qa-db-ja.com

C#を使用してコンテンツを取得するためのHTMLの解析

Webページのグループをクロールするアプリケーションを作成しています。ページのソースコード全体を取得するのではなく、すべてのコンテンツを取得して保存し、データベース内にプレーンテキストとしてページを保存できるようにします。コンテンツは他のアプリケーションで使用され、ユーザーが読むことはないため、完全に人間が読めるようにする必要はありません。

当初は正規表現を使うことを考えていましたが、ウェブページの有効性をコントロールできず、正規表現がないとコンテンツが出てしまう可能性が高いです。

文字列内にソースコードがある場合、そのソースコードの文字列をC#のコンテンツだけに変換するにはどうすればよいですか?

9
Mike B

何が必要かは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();
21
Marc Gravell

HTMLを自分で解析しないでくださいしないでください!標準の正規表現だけを使用してHTMLを解析することはできません。それは不可能です。

そこにはたくさんの無料のライブラリがあります。 .NETの世界で最高の無料のものの1つは、 HTML Agility Pack です。

HTML Agility Packは、不正な形式のドキュメントもサポートします。これは、正規表現やXMLなどの他の基本的な解析ではほとんど機能しません。

7
Eilon

以下の関数は、すべての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("&nbsp;", string.Empty);

    return htmlString;
}
2
alin0509

マークアップから生のテキストを取り除き、それを記事に表示するコードを作成しました HTMLをテキストに変換 。提示されたコードは非常にシンプルで軽量です。

また、軽量のHTMLパーサーを作成し、Githubに HTML Monkey として投稿しました。これはより完全な解決策であり、解析されたマークアップを変換してテキストのみを取得するのは簡単な作業です。私はまだこのプロジェクトに取り組んでおり、それがどのように機能するかについてのフィードバックを探しています。

0
Jonathan Wood