c#子字符串-解析之间的所有文本

时间:2019-04-24 05:46:53

标签: c# substring

尝试从下面的html代码解析所有文本(主要是url)。但是我只想为每个(所有)事件获取这些div标签(result-firstline-title)和(result-url js-result-url)之间的网址。

要清楚,我能够从下面的html源中获取所有url,但问题是它也几乎获取了3次url。并且为此,我有一个删除重复网址的修复程序,但是,如果您仔细查看html源代码,您会发现它也捕获了第三个网址。

<div class="result js-result card-mobile ">
<div class="result-firstline-container">
    <div class="result-firstline-title">
        <a
            class="result-title js-result-title"

            href="https://www.lifewire.com/top-social-networking-sites-people-are-using-3486554"

        >
            The Top Social Networking Sites People Are Using
        </a>
    </div>

</div>

<a
    class="result-url js-result-url"

    href="https://www.lifewire.com/top-social-networking-sites-people-are-using-3486554">https://www.lifewire.com/top-<b>social-networking-sites</b>-people-are...
</a>
<p class="result-snippet">
    The Top
</p>
</div>

<div class="result js-result card-mobile ">
    <div class="result-firstline-container">
        <div class="result-firstline-title">
            <a
                class="result-title js-result-title"

                href="http://www.ebizmba.com/articles/social-networking- websites"

            >
                Top 15 Most Popular Social Networking Sites | January 2019
            </a>
        </div>

    </div>

    <a
        class="result-url js-result-url"

        href="http://www.ebizmba.com/articles/social-networking- websites">www.ebizmba.com/articles/<b>social-networking</b>-<b>websites</b>
    </a>
    <p class="result-snippet">
        Top 15 Most 
    </p>

</div>     

我已经尝试了以下c#代码来获取div标签之间的文本,但它可以获取我不想要的所有内容。

        int urlTagFrom = rawHTMLFromSource.IndexOf("result-firstline-title") + "result-firstline-title".Length;
        int urlTagTo = rawHTMLFromSource.LastIndexOf("result-url js-result-url");
        urlTagCollection = rawHTMLFromSource.Substring(urlTagFrom, urlTagTo - urlTagFrom);

要获取网址,我正在使用以下内容:

var regexURLParser = new Regex(@"(http|ftp|https):\/\/([\w\-_]+(?:(?:\.[\w\-_]+)+))([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?", RegexOptions.Singleline | RegexOptions.CultureInvariant);

我要获取的是这些网址:

        <a
            class="result-title js-result-title"

            href="https://www.lifewire.com/top-social-networking-sites-people-are-using-3486554"

        >

        <a
            class="result-title js-result-title"

            href="http://www.ebizmba.com/articles/social-networking-websites"

        >

以使结果仅显示:

https://www.lifewire.com/top-social-networking-sites-people-are-using-3486554
http://www.ebizmba.com/articles/social-networking-websites 

非常感谢。如果有什么听起来令人困惑的地方,请告诉我,以便我尝试其他方法进行解释。

1 个答案:

答案 0 :(得分:2)

您可以通过使用HTMLAgilityPack使其更容易,只需使用NuGet将其包括在项目中即可。

要使用NuGet添加HTMLAgilityPack

转到Package Manager Console并输入Install-Package HtmlAgilityPack -Version 1.11.3

安装后,您可以按以下方式提取Urls。

var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(@"put html string here");

var listOfUrls = new List<string>();
doc.DocumentNode.SelectNodes("//a").ToList()
   .ForEach(x=> 
           {
              //Use HasClass method to filter elements 
              if (!string.IsNullOrEmpty(x.GetAttributeValue("href", "")) 
                   && x.HasClass("result-title") && x.HasClass("js-result-title"))
              {
                 listOfUrls.Add(x.GetAttributeValue("href", ""));
              }
           });

listOfUrls.ForEach(x => Console.WriteLine(x));

编辑

添加了&& x.HasClass("result-title") && x.HasClass("js-result-title"),以仅显示具有result-title和js-result-title类的元素。

另一种方式

更简短,也是获取过滤值的另一种方法。

var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(@"put html string here");

var listOfUrls = doc.DocumentNode.Descendants("a")
    .Where(x => x.Attributes["class"] != null 
                && x.Attributes["class"].Value == "result-title js-result-title")
    .Select(x => x.GetAttributeValue("href", "")).ToList();