Inneres HTML analysieren

c# html-agility-pack html-parsing

Frage

Das möchte ich analysieren

<div class="photoBox pB-ms">
<a href="/user_details?userid=ePDZ9HuMGWR7vs3kLfj3Gg">
<img width="100" height="100" alt="Photo of Debbie K." src="http://s3-media2.px.yelpcdn.com/photo/xZab5rpdueTCJJuUiBlauA/ms.jpg">
</a>
</div>

Ich verwende folgenden XPath, um es zu finden

HtmlNodeCollection bodyNode = htmlDoc.DocumentNode.SelectNodes("//div[@class='photoBox pB-ms']");

Das ist in Ordnung und zurück, s ich alle Div, s mit Photobox-Klasse

Aber wenn ich ahref benutzen möchte

HtmlNodeCollection bodyNode = htmlDoc.DocumentNode.SelectNodes("//div[@class='photoBox pB-ms'//a href]");

Ich habe ein ungültiges Token erhalten.

Auch ich habe versucht, Abfrage zu verwenden

   var lowestreview =
  from main in htmlDoc.DocumentNode.SelectNodes("//div[@class='photoBox pB-ms']") 
   from rating in main.SelectNodes("//a href")
  select new { Main=main.Attributes[0].Value,AHref = rating.ToString() };

Will jemand mir sagen, wie man XPath schreibt oder abfragt, um dieses AHref zu erhalten

Akzeptierte Antwort

Das funktioniert (getestet):

HtmlNodeCollection bodyNodes = htmlDoc.DocumentNode
                                      .SelectNodes("//div[@class='photoBox pB-ms']/a[@href]");
foreach(var node in bodyNodes)
{
    string href = node.Attributes["href"].Value;
}

Das Problem ist, dass Sie Attribut- und Elementselektoren miteinander vermischt haben. Auch von dir stellt es unklar dar, ob man eigentlich eine Sammlung abfragen wollte.

Der XPath - Selektor oben wählt alle a Element , die eine haben href Attribut , das Kind Knoten eines ist div mit einer Klasse von Elemente 'photoBox pB-ms' . Sie können diese Auflistung dann iterieren und den Wert des href Attributs für jedes Element href .

HtmlAgilityPack unterstützt jetzt auch Linq (seit 1.4), also könnte man einfach einen bestimmten Attributwert erhalten (imo):

string hrefValue = htmlDoc.DocumentNode
                          .Descendants("div")
                          .Where(x => x.Attributes["class"].Value == "photoBox pB-ms")
                          .Select(x => x.Element("a").Attributes["href"].Value)
                          .FirstOrDefault();

Beliebte Antwort

Anstatt XML- Analyse können Sie HTMLAgilePack verwenden

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml([HTML Text]);
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"])
{
    HtmlAttribute att = link["href"];
    // att.Value
}


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