HTML文書を解析していくつかの要素(テキストファイルへのリンク)を抽出しようとしています。HTMLドキュメントの解析:正規表現またはLINQ?
現在の戦略は、HTMLドキュメントを文字列にロードすることです。次に、テキストファイルへのリンクのすべてのインスタンスを検索します。どんなファイルタイプでも構いませんが、この質問のためにテキストファイルです。
最後の目標は、IEnumerable
文字列オブジェクトのリストを持つことです。その部分は簡単ですが、データの解析は問題です。
<html>
<head><title>Blah</title>
</head>
<body>
<br/>
<div>Here is your first text file: <a href="http://myServer.com/blah.txt"></div>
<span>Here is your second text file: <a href="http://myServer.com/blarg2.txt"></span>
<div>Here is your third text file: <a href="http://myServer.com/bat.txt"></div>
<div>Here is your fourth text file: <a href="http://myServer.com/somefile.txt"></div>
<div>Thanks for visiting!</div>
</body>
</html>
初期のアプローチは、以下のとおりです。
- は、XMLドキュメントに文字列をロードし、LINQのからXML形式でそれを攻撃します。
href=
から始まる文字列を探すために、正規表現を作成し、.txt
で質問ビーイング終了:その正規表現が好きなものを見える
- を?私は正規表現初心者であり、これは私の正規表現学習の一部です。
- どの方法を使用してタグのリストを抽出しますか?
- これは最も効果的な方法でしょうか?
- どのメソッドが最も読みやすく/維持可能でしょうか?
アップデート:HTML敏捷性パックの提案にMatthewから 賞賛。それはうまくいった! XPathの提案も同様に機能します。私は両方の答えを '答え'にすることができたらいいと思いますが、明らかにできません。どちらも問題の有効な解決策です。
ここには、Jeffで提案されている正規表現を使用したC#コンソールアプリがあります。それは文字列の細かい部分を読み込み、.txtで終わっていないhrefは含めません。与えられたサンプルでは、(HTML文字列関数で提供されているように)結果にファイル.txt.snarg
が正しく含まれません。
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
namespace ParsePageLinks
{
class Program
{
static void Main(string[] args)
{
GetAllLinksFromStringByRegex();
}
static List<string> GetAllLinksFromStringByRegex()
{
string myHtmlString = BuildHtmlString();
string txtFileExp = "href=\"([^\\\"]*\\.txt)\"";
List<string> foundTextFiles = new List<string>();
MatchCollection textFileLinkMatches = Regex.Matches(myHtmlString, txtFileExp, RegexOptions.IgnoreCase);
foreach (Match m in textFileLinkMatches)
{
foundTextFiles.Add(m.Groups[1].ToString()); // this is your captured group
}
return files;
}
static string BuildHtmlString()
{
return new StringReader(@"<html><head><title>Blah</title></head><body><br/>
<div>Here is your first text file: <a href=""http://myServer.com/blah.txt""></div>
<span>Here is your second text file: <a href=""http://myServer.com/blarg2.txt""></span>
<div>Here is your third text file: <a href=""http://myServer.com/bat.txt.snarg""></div>
<div>Here is your fourth text file: <a href=""http://myServer.com/somefile.txt""></div>
<div>Thanks for visiting!</div></body></html>").ReadToEnd();
}
}
}
オープンソースのHTMLパーサーを使用していますか? – Jeff
@JD:絶対に!マシューが示唆したように、HTMLアジリティパックは一見の価値があります。あなたはそれを提案するつもりでしたか? –
@Philoushka私はHTMLアジリティパックを提案しようとしていました...それは岩です。 – Jeff