HtmlAgilityPack élément multiple

c# html-agility-pack regex

Question

J'ai un document HTML qui contient plusieurs divs

Exemple:

<div class="element">
    <div class="title">
        <a href="127.0.0.1" title="Test>Test</a>
    </div>
</div>

Maintenant, j'utilise ce code pour extraire l'élément title.

List<string> items = new List<string>();
var nodes = Web.DocumentNode.SelectNodes("//*[@title]");
if (nodes != null)
{
   foreach (var node in nodes)
   {
       foreach (var attribute in node.Attributes)
           if (attribute.Name == "title")
               items.Add(attribute.Value);
   }
}

Je ne sais pas comment adapter mon code pour extraire simultanément l'élément href et l'élément title.

Chaque div doit être un objet avec les balises incluses comme propriétés.

public class CheckBoxListItem
{
    public string Text { get; set; }
    public string Href { get; set; }
}

Réponse acceptée

Vous pouvez utiliser la requête xpath suivante pour extraire uniquement les balises avec un titre et href:

//a[@title and @href]

Vous pouvez utiliser votre code comme ceci:

List<CheckBoxListItem> items = new List<CheckBoxListItem>();
var nodes = Web.DocumentNode.SelectNodes("//a[@title and @href]");
if (nodes != null)
{
   foreach (var node in nodes)
   {
      items.Add(new CheckBoxListItem()
      {
        Text = node.Attributes["title"].Value,
        Href = node.Attributes["href"].Value
      });
   }
}

Réponse populaire

J'utilise très souvent le paquet ScrapySharp avec HtmlAgilityPack pour la sélection css.

(ajoutez une instruction using pour ScrapySharp.Extensions afin que vous puissiez utiliser la méthode CssSelect).

using HtmlAgilityPack;
using ScrapySharp.Extensions;

Dans votre cas, je ferais:

HtmlWeb w = new HtmlWeb();

var htmlDoc = w.Load("myUrl");
var titles = htmlDoc.DocumentNode.CssSelect(".title");
foreach (var title in titles)
{
    string href = string.Empty;
    var anchor = title.CssSelect("a").FirstOrDefault();

    if (anchor != null)
    {
        href = anchor.GetAttributeValue("href");
    }
}


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow