Я хочу извлечь все ссылки внутри тега div с классом span12 и <p>Автомобильные бренды </p> - PullRequest
1 голос
/ 17 марта 2020
HtmlWeb web = new HtmlWeb();
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
                HtmlDocument doc = web.Load("https://www.fcagroup.com/en-US/group/regions/Pages/northamerica.aspx");
                var foundAppropriateMetaTag = false;
                var divs = doc.DocumentNode.SelectNodes("//div[contains(@class,'span12')]");
                var linksOnPage = from lnks in divs.Descendants()
                                  where lnks.Name == "a" &&
                                  lnks.Attributes["href"] != null &&
                                 lnks.InnerText.Trim().Length > 0
                                  select new
                                  {
                                      Url = lnks.Attributes["href"].Value,
                                      Text = lnks.InnerText,

                                  };

Я пробовал выше, но он извлекает все ссылки из всех элементов div с классом span12, но мне нужны только ссылки внутри элемента div, содержащего PTag Automotive Brands. Помоги мне достичь этого.

1 Ответ

0 голосов
/ 17 марта 2020

Ниже var divs = doc.DocumentNode.SelectNodes("//div[contains(@class,'span12')]"); вы можете добавить следующий код.

var autoNodes = new List<HtmlNode>();
foreach (var div in divs)
{
    if (div.ChildNodes.Any(c => c.InnerText.Contains("Automotive Brands")))
    {
         autoNodes.Add(div);
    }
}

var links = new List<KeyValuePair<string, string>>();
foreach (var node in autoNodes)
{
     var nodeLinks = node.Descendants().Where(c => c.Name.Equals("a")
                                                  && c.Attributes["href"].Value.Contains("brands")
                                                  && !string.IsNullOrEmpty(c.InnerText.Trim()));
     links.AddRange(nodeLinks.Select(nl =>
                     new KeyValuePair<string, string>(nl.Attributes["href"].Value, nl.InnerText)));

}

Это читаемая версия.

Вы можете преобразовать его в

var autoNodes = divs.Where(div => div.ChildNodes.Any(c => c.InnerText.Contains("Automotive Brands"))).ToList();

, если хотите.

...