HtmlAgilityPack mehrere Elemente

c# html-agility-pack regex

Frage

Ich habe ein HTML-Dokument, das mehrere divs enthält

Beispiel:

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

Jetzt benutze ich diesen Code, um das Titelelement zu extrahieren.

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);
   }
}

Ich weiß nicht, wie ich meinen Code anpassen soll, um die href und das Titelelement gleichzeitig zu extrahieren.

Jedes div sollte ein Objekt mit den eingeschlossenen a Tags als Eigenschaften sein.

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

Akzeptierte Antwort

Mit der folgenden xpath-Abfrage können Sie nur Tags mit einem Titel und href abrufen:

//a[@title and @href]

Sie können Ihren Code wie folgt verwenden:

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
      });
   }
}

Beliebte Antwort

Ich benutze ScrapySharps Paket sehr oft zusammen mit HtmlAgilityPack für die CSS-Auswahl.

(Fügen Sie eine using-Anweisung für ScrapySharp.Extensions hinzu, damit Sie die CssSelect-Methode verwenden können).

using HtmlAgilityPack;
using ScrapySharp.Extensions;

In Ihrem Fall würde ich tun:

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

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum