6

A-ZNN:NN:NN:NNのようなパターンを使用してテキストを検索することにより、Web ページ上のリンクを見つけることは可能ですかN

PHP で正規表現を使用してテキストをリンクに変換したので、C# を使用して Selenium でこの種のフィルターを使用して、特定の形式に従ってすべて同じように見えるリンクを見つけることができるかどうか疑問に思っていました。

私は試した:

driver.FindElements(By.LinkText("[A-Z][0-9]{2}):([0-9]{2}):([0-9]{2}):([0-9]{2}")).ToList();

しかし、これはうまくいきませんでした。何かアドバイス?

4

2 に答える 2

11

一言で言えば、FindElement()要素を見つけるための正規表現の使用をサポートする戦略はありません。これを行う最も簡単な方法は、 を使用FindElements()してページ上のすべてのリンクを検索し、それらの.Textプロパティを正規表現に一致させることです。

ただし、リンクをクリックしても同じブラウザー ウィンドウの新しいページに移動する (つまり、リンクをクリックしても新しいブラウザー ウィンドウが開かない) 場合は、すべてのリンクの正確なテキストをキャプチャする必要があります。後で使用するためにクリックしたいです。これについて言及するのは、最初のFindElements()呼び出しで見つかった要素への参照を保持しようとすると、最初の要素をクリックした後にそれらが古くなってしまうからです。これがシナリオの場合、コードは次のようになります。

// WARNING: Untested code written from memory. 
// Not guaranteed to be exactly correct.
List<string> matchingLinks = new List<string>();

// Assume "driver" is a valid IWebDriver.
ReadOnlyCollection<IWebElement> links = driver.FindElements(By.TagName("a"));

// You could probably use LINQ to simplify this, but here is
// the foreach solution
foreach(IWebElement link in links)
{
    string text = link.Text;
    if (Regex.IsMatch("your Regex here", text))
    {
        matchingLinks.Add(text);
    }
}

foreach(string linkText in matchingLinks)
{
    IWebElement element = driver.FindElement(By.LinkText(linkText));
    element.Click();
    // do stuff on the page navigated to
    driver.Navigate().Back();
}
于 2012-09-17T00:13:22.007 に答える
2

Html の解析に正規表現を使用しないでください。

htmlagilitypackを使用する

次の手順を実行できます。

Step1HTML PARSER特定の Web ページからすべてのリンクを抽出し、リストに保存するために使用します。

HtmlWeb hw = new HtmlWeb();
 HtmlDocument doc = hw.Load(/* url */);
 foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href]"))
 {
//collect all links here
 }

Step2この正規表現を使用して、リスト内のすべてのリンクを照合します

.*?[A-Z]\d{2}:\d{2}:\d{2}:\d{2}.*?

ステップ 3目的のリンクを取得します。

于 2012-09-16T15:20:30.863 に答える