2010-11-23 7 views
0

私はC#で、以下のようなHTMLのhrefの値を取得する必要があり:次のコードから 'href'値を取得しますか?

<td class="tl"><a href="http://facebook.com/"target="_blank"><img src="images/poput_icon.png"/></a> 

誰もがこれを行う方法を私を見ることができますか? RegExは最良のアプローチですか? 100sのリンクを含むページからこれらを集める必要がありますが、それらはすべて上記のコードのように見えます。私はページ上の他のhrefを無視したい。

ありがとうございます。

ジミー

+0

Regexを使ってXMLを解析しないでください:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

+0

私は、 C#は有効なXMLのためのステッカーであり、誤った入力があった場合には例外をスローすることを覚えておいてください。取得したXMLが有効であることが分かっている場合は、XMLパーサーを使用します。しかし、XMLのように見える任意のドキュメントを取得していてもそうでないドキュメントを取得している場合は、正規表現などの他のツールが必要になります。いいえ、正規表現ではXMLを実際には "解析"できませんが、クリアパターンに一致する1つのタグから単一のフィールドを抽出しようとしています。 –

答えて

1

まず、正規表現を使用してXMLを解析しないでください。 more detailed information on the whys and whereforesについてはこちらをご覧ください。

第2に、これを達成するためにLINQ-to-XMLを使用できます。あなたはXDocumentインスタンスにあなたのXMLスニペットをロードしていると仮定すると、(そのため、tdは、ルート要素である)、あなたは、次の操作を行うことができます

var href = doc 
    .Element("td") 
    .Element("a") 
    .Attribute("href") 
    .Value; 
+0

とにかく正規表現を推薦する唯一の理由は、.NETは一般的に有効なXMLについてはかなり辛抱強いことです。これは自動リンク・スクレイピング・ツールのように見えます。つまり、信頼できないソースから作業している可能性があります。具体的には、有効なXMLが吐出されないことを保証できません。私はその質問が主に正しいフォーマットのリンクを特定することにあったと思う。とにかくXML解析はおそらく正しい戦略ですが、この具体的な答えは実際のターゲット識別の問題には対処していません。 –

+0

このような簡単な質問から、多くの仮定があります。手に入れる情報と、RegExがHTMLやXMLの解析に完全に間違ったアプローチであるという事実に基づいて、これが最も適切な答えです。 OPが逆に詳細を追加すれば、私は確かに私の応答を見直すことになるでしょう。 –

+0

"リンクを100個含むページからこれらを集める必要がありますが、それらはすべて上記のコードのように見えます。ページ上の他のhrefを無視したいと思います。 - したがって、XMLが有効であると仮定することができますが、上記の形式のように見えるリンクのみを見つけるためには、缶XMLのパーサーを使用する方法を説明する必要があります。 (これはよく指定されていないので、私は過度の正規表現を持っています。)正直なところ、私は個人的に知りたいです。私はXML解析ライブラリの経験が不十分であり、より精巧な例を見たいと思っています。 –

1

私はそう、正規表現でこれを行うだろう。だから、あなたはテーブルセルの先頭にあるimgタグを囲むアンカータグの中の値を探したいでしょうか?

ここではC#のコードがdocumentを検索する文書全体を含む文字列である場合には、それを使用し、そのようなリンクと一致しますRegexオブジェクトを作成することです:

Regex linkscraper = new Regex(@"<\s*td[^>]*>\s*<\s*a[^>]*href\s*=\s*""(?<link>[^""]*)""[^>]>\s*<\s*img[^>]*>\s*<\s*\/a\s*>"); 
MatchCollection links = linkscraper.matches(document); 

マッチングリンクがでMatchオブジェクトでありますLinksコレクション。グループ名は「link」です。

@はこれを生の文字列に変換します。すべて\は処理されるのではなく直接渡されるため、正規表現\動作を許可するように二重にする必要はありません。引用符は\でエスケープすることはできませんので、 『」生の文字列では、彼らがでエスケープしている』

これはかなり複雑な正規表現でそれを破壊:。。

  • それが束に飛び散っています\s*要素を大まかに「任意の空白またはなし」と指定すると、HTMLで許可されているスペーシングのバリエーションを無視します。
  • [^>]文字クラスは ">"以外のものと一致し、 *)は、 "私たちが気にしないタグの中の他のもの"を表しています。除外は、正規表現が線引きされてタグ外に出るのを防ぐことです。正規表現は貪欲であるため、文書内の最初のタグの最初の部分は、これを行わなければ、最後のタグの終わりまで明るく一致します。
  • すべてのそれらの部分を説明して、それを理解することは比較的簡単です:
    • (またはスペース、または属性があってもなくてもよい)TDタグ、すぐに(任意の空白を許可する「すぐ」の定義のための)に続いて
    • Aタグ.hrefは「link」という名前のキャプチャグループに取り込まれます。 [^"]のエスケープ形式である[^""]は、すべての非クォート文字に一致します。残りのタグは気にしません。
    • imgタグ。必要なものを含めることができます。
    • /a終了タグ。

あなたがからのリンクを抽出しようとしている文書の正確なフォーマットについての詳細を知っている場合は、この正規表現を引き締めることができます。具体的には、[^>]*グループは、タグに任意の値を含めることを許可するために使用される> "ブロックではないゼロ個以上の文字と一致します。"は、おそらく実際の文書により限定された部分式に置き換えてください。これは、フォーム<TD><A href=...><IMG></a>のいずれかをキャッチします。これは、必要以上に一致する場合もあります。

+0

正規表現を使用してHTMLやXMLを解析しないでください:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

+0

Do not do canned XMLパーサーを使用して、わずかに(または潜在的に重大な)無効と思われる信頼できないHTML文書を解析します。私はこれが自動リンク・スクレーパーであると仮定しています(潜在的に悪ですが、私も同様です)。そうしなければ、データを抽出する他の方法、何百ものリンクからなるこのテーブルを生成しました。ブラウザーにやさしい方法でHTMLを不正な形式にすることは、まさにこれらの偽善者に対する防衛の第一線である。 –

+0

@Adam Norberg - 何も悪い:-) - 私がリンクを取得するために必要な実際のページは、www.google.com/adplanner/static/top1000/(世界でトップ1000のサイト)で、不快なウェブサイト(つまり、これらがブロックされていないことを確認する)。 –

関連する問題