WebページのHTML全体を文字列に保存しました。次に、リンクから「href」値を取得します。できれば、後で別の文字列に保存できるようにします。これを行うための最良の方法は何ですか?
文字列を.xmlドキュメントとして保存し、XPathDocumentナビゲーターを使用して解析しようとしましたが、(驚いたことに)非実際のxmlドキュメントをうまくナビゲートできません。
正規表現は、私が達成しようとしていることを達成するための最良の方法ですか?
WebページのHTML全体を文字列に保存しました。次に、リンクから「href」値を取得します。できれば、後で別の文字列に保存できるようにします。これを行うための最良の方法は何ですか?
文字列を.xmlドキュメントとして保存し、XPathDocumentナビゲーターを使用して解析しようとしましたが、(驚いたことに)非実際のxmlドキュメントをうまくナビゲートできません。
正規表現は、私が達成しようとしていることを達成するための最良の方法ですか?
HTMLAgilityPackをお勧めします。HTMLを解析する必要があるいくつかのケースで使用しましたが、うまく機能します。HTMLをロードしたら、XPath式を使用してドキュメントをクエリし、アンカータグ(およびそこにある他のほぼすべてのもの)を取得できます。
HtmlDocument yourDoc = // load your HTML;
int someCount = yourDoc.DocumentNode.SelectNodes("your_xpath").Count;
正規表現はそれを行う1つの方法ですが、問題が発生する可能性があります。
ご存知のように、ほとんどのHTMLページは検証されないため、標準のhtml手法を使用して解析することはできません。
HTML Tidyまたは同様のツールを統合するために時間を費やすことができますが、必要な正規表現を作成する方がはるかに高速です。
アップデート
この更新の時点で、私は15の賛成票と9つの反対票を受け取りました。多分人々はこの答えに対する質問やコメントを読んでいないと思います。OPがやりたかったのは、href値を取得することだけでした。 それでおしまい。 その観点からは、単純な正規表現で十分です。著者が他の項目を解析したかった場合、最初に述べたように正規表現を推奨する方法はありません。せいぜい問題があります。
すべての形状とサイズのHTMLを処理するには、HTMLAgilityパック@ http://www.codeplex.com/htmlagilitypackを使用することをお勧めします。これにより、必要なノードに対してXPathを記述し、それらをコレクションに返すことができます。
おそらくMajesticパーサーのようなものが欲しいでしょう: http://www.majestic12.co.uk/projects/html_parser.php
不安定な html を処理できる他のオプションもいくつかあります。他の誰かが言及したように、Html Agility Pack は一見の価値があります。
HTML はコンテキストフリーではないため、正規表現は HTML の理想的なソリューションではないと思います。不正確な場合でも、おそらく適切な結果が得られます。決定論的に URI を識別することでさえ厄介な問題です。
可能であれば、車輪を再発見しない方が常に良いです。HTML を整形式の XML に変換したり、XmlReader として機能したりする優れたツールがいくつかあります。
以下に 3 つの優れたツールを示します。
オープンソース プログラムであるTagSoupは、 John Cowanによって開発された Java および SAX ベースのツールです。これは Java で書かれた SAX 準拠のパーサーであり、整形式または有効な XML を解析する代わりに、実際に見られる HTML をそのまま解析します。TagSoup は、合理的なアプリケーション設計に似たものを使用して、このような処理を行う必要がある人向けに設計されています。SAX インターフェイスを提供することにより、標準の XML ツールを最悪の HTML に適用することもできます。TagSoup には、HTML ファイルを読み取り、クリーンな HTML または XHTML に近い整形式の XML を生成できるコマンドライン プロセッサも含まれています。
Taggleは、TagSoup の商用 C++ ポートです。
SgmlReaderは、Microsoft のChris Lovettによって開発されたツールです。
SgmlReader は、任意の SGML ドキュメント (HTML の組み込みサポートを含む) に対する XmlReader API です。整形式の XML 結果を出力するコマンド ライン ユーティリティも提供されます。
スタンドアロンの実行可能ファイルと完全なソース コードを含む zip ファイルをダウンロードします: SgmlReader.zip
David Carlisleによって書かれた純粋な HTML の XSLT 2.0 パーサーは、傑出した業績です。
そのコードを読むことは、私たち全員にとって素晴らしい学習練習になるでしょう.
説明から:
" d:htmlparse(string)
d:htmlparse(string,namespace,html-mode)
引数が 1 つの場合は、
d:htmlparse(string,' http://ww.w3.org/1999/xhtml ',true ()))
組み込みのヒューリスティックを使用して文字列を HTML および/または XML として解析し、
暗黙の要素の開閉を制御します.
HTML DTD の完全な知識はありませんが、
空の要素の完全なリストとエンティティの完全なリストを持っています.定義. HTML エンティティ, および
10 進数と 16 進数の文字参照はすべて受け入れられます.
html-mode=false() の場合でも html-entities が認識されることに注意してください.
要素名は小文字化され (html-mode が true() の場合)、
名前空間パラメーターによって指定された名前空間 (
入力に明示的な名前空間宣言がない限り、名前空間がないことを示すために "" で
ある場合があります。その場合、これらは尊重されます。html
-mode=true() の場合、属性名は小文字で表示されます"
詳細な説明はこちらをご覧ください。
これが役に立ったことを願っています。
乾杯、
ディミトレ・ノヴァチェフ。
私はChrisLivelyに同意します。なぜなら、HTMLはあまりよく形成されていないことが多いので、おそらくこれには正規表現を使用するのが最善でしょう。
href=[\"\'](http:\/\/|\.\/|\/)?\w+(\.\w+)*(\/\w+(\.\w+)?)*(\/|\?\w*=\w*(&\w*=\w*)*)?[\"\']
ここからRegExLibで始めましょう
ドキュメントが少なくとも整形式であることを知っているか、修正できる場合は、xml を使用する方がうまくいく可能性があります。適切なhtml (または xhtml)があれば、.Net の xml システムでそれを処理できるはずです。残念ながら、優れた html は非常にまれです。
一方、正規表現はhtml の解析が非常に苦手です。幸いなことに、完全な html 仕様を処理する必要はありません。心配する必要があるのはhref=
、文字列を解析して URL を取得することだけです。これでも難しいので、すぐには試しません。代わりに、いくつかの基本ルールを確立するために、いくつかの質問をすることから始めます。それらは基本的にすべて「ドキュメントについてどのくらい知っていますか?」に要約されますが、次のようになります。
href=
ドキュメント内にあり、アンカー タグに属していない可能性もあります)。「LINQ to HTML」を使用できるようにするコードをここにリンクしました...