1

私は多数の HTML ドキュメントを解析しており、それぞれの必要に応じて英国の住所を抽出しようとしています。そのために、AngleSharp で HTML を解析し、正規表現に一致する TextContent を持つノードを探しています。

var parser = new HtmlParser();
var source =  "<html><head><title>Test Title</title></head><body><h1>Some example source</h1><p>This is a paragraph element and example postode EC1A 4NP</body></html>";
var document = parser.Parse(source);
Regex searchTerm = new Regex("([A-PR-UWYZ][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)");
var list = document.All.Where(m => searchTerm.IsMatch((m.TextContent ?? "").ToUpper()));

htmlこれは、bodyp要素の 3 つの結果を返します。私が返したい唯一の要素は p 要素です。これは、innerText が正規表現に正しく一致しているためです。ページに複数の一致がある場合もあるため、最後の結果を返すことはできません。その要素のテキスト (子ノードではない) が正規表現と一致する要素を返すだけです。

編集

ドキュメント構造や、郵便番号が含まれるタグさえも事前に知らないため、正規表現を使用しています。結果が得られたら、dom をトラバースして残りのアドレスを取得することを計画しているので、ドキュメントを文字列として扱いたくないだけです

4

3 に答える 3

0

わかりました、私は最終的に別のアプローチを取りました。HTMLドキュメントをRegExで文字列として検索して、HTMLを解析するのではなく、単に正確な一致値を見つけました。その値を取得したら、xpath 式を使用してノードを返すのは簡単でした。上記の例では、正規表現検索は EC1A 4NP と次の XPATH を返します。

//*[contains(text(),'EC1A 4NP')]

必要なノードを返します。XPath を簡単にするために、HTML 解析用に AngleSharp から HtmlAgilityPack に切り替えました。

于 2016-01-27T15:44:47.963 に答える
0

整形式の HTML/XML ドキュメント内の特定のノードを抽出する場合は、XPath の利用を検討してください。MSDNにいくつかの例があります

HTML Tidyなどのユーティリティ ライブラリを使用して、html を「クリーンアップ」し、まだ整形されていない場合は整形することができます。

于 2016-01-27T00:45:54.513 に答える