0

C#(WPF)でmshtmlを使用して、次のHTMLコードからhrefリンクを取得しようとしています。

<a class="button_link" href="https://rhystowey.com/account/confirm_email/2842S-B2EB5-136382?t=1&amp;sig=b0dbd522380a21007d8c375iuc583f46a90365d9&amp;iid=am-130280753913638201274485430&amp;ac=1&amp;uid=1284488216&amp;nid=18+308" style="border:none;color:#0084b4;text-decoration:none;color:#ffffff;font-size:13px;font-weight:bold;font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;">Confirm your account now</a>

次のコードを使用して、C#(WPF)でmshtmlを使用してこれを機能させようとしましたが、惨めに失敗しました。

HTMLDocument mdoc = (HTMLDocument)browser.Document;
string innerHtml = mdoc.body.outerText;
string str = "https://rhystowey.com/account/confirm_email/";
int index = innerHtml.IndexOf(str);
innerHtml = innerHtml.Remove(0, index + str.Length);
int startIndex = innerHtml.IndexOf("\"");
string str3 = innerHtml.Remove(startIndex, innerHtml.Length - startIndex);
string thelink = "https://rhystowey.com/account/confirm_email/" + str3;

誰かがこれを機能させるのを手伝ってくれませんか。

4

2 に答える 2

1

これを使って:

var ex = new Regex("href=\"(.*)\" style");
var tag = "<a class=\"button_link\" href=\"https://rhystowey.com/account/confirm_email/2842S-B2EB5-136382?t=1&amp;sig=b0dbd522380a21007d8c375iuc583f46a90365d9&amp;iid=am-130280753913638201274485430&amp;ac=1&amp;uid=1284488216&amp;nid=18+308\" style=\"border:none;color:#0084b4;text-decoration:none;color:#ffffff;font-size:13px;font-weight:bold;font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;\">Confirm your account now</a>";

var address = ex.Match(tag).Groups[1].ToString();

ただし、たとえばGroups[1]範囲外になる可能性があるため、チェックを使用して拡張する必要があります。

あなたの例では

HTMLDocument mdoc = (HTMLDocument)browser.Document;
string innerHtml = mdoc.body.outerText;
var ex = new Regex("href=\"([^\"\"]+)\"");
var address = ex.Match(innerHtml).Groups[1].ToString();

最初のに一致しhref="..."ます。または、すべてのオカレンスを選択します。

var matches = (from Match match in ex.Matches(innerHtml) select match.Groups[1].Value).ToList();

これによりList<string>、HTML内のすべてのリンクが表示されます。これをフィルタリングするには、この方法で行うことができます

var wantedMatches = matches.Where(m => m.StartsWith("https://rhystowey.com/account/confirm_email/"));

開始文字列などのリストと照合できるため、より柔軟性があります。または、正規表現でそれを行うと、パフォーマンスが向上します。

var ex = new Regex("href=\"(https://rhystowey\\.com/account/confirm_email/[^\"\"]+)\"");

私が理解している限り、それをすべてあなたが望むものにまとめる

var ex = new Regex("href=\"(https://rhystowey\\.com/account/confirm_email/[^\"\"]+)\"");
var matches = (from Match match in ex.Matches(innerHTML)
               where match.Groups.Count >= 1
               select match.Groups[1].Value).ToList();
var firstAddress = matches.FirstOrDefault();

firstAddressリンクがある場合は、それを保持します。

于 2013-03-22T00:50:30.780 に答える
0

リンクが常に同じパスで始まり、ページ上で繰り返されない場合は、これを使用できます(テストされていません)。

    var match = Regex.Match(html, @"href=""(?<href>https\:\/\/rhystowey\.com\/account\/confirm_email\/[^""]+)""");

    if (match.Success)
    {
      var href = match.Groups["href"].Value;
      ....
    }
于 2013-03-22T00:57:40.847 に答える