Parse HTML interno

c# html-agility-pack html-parsing

Domanda

Questo è quello che voglio analizzare

<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>

Sto usando XPath per trovarlo

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

Questo va bene e ritorna, s me tutti div, s con classe photobox

Ma quando voglio usare ahref

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

Ho ottenuto un token non valido per errore.

Inoltre ho provato a usare la query

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

Qualcuno mi dirà come scrivere XPath o query per ottenere questo AHref

Risposta accettata

Funziona (testato):

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

Il problema è che hai selezionato attributi e selettori di elementi. Anche da parte tua non è chiaro se avevi davvero intenzione di richiedere una raccolta .

Il selettore XPath sopra selezionerà tutti a elementi che hanno un href attributo che sono nodi figlio di un div elemento con una classe di 'photoBox pB-ms' . È quindi possibile iterare questa raccolta e ottenere il valore dell'attributo href di ciascun elemento.

Anche HtmlAgilityPack ora supporta Linq (dalla versione 1.4), quindi è sufficiente ottenere un valore di attributo particolare molto più semplice (imo) come questo:

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

Risposta popolare

Invece dell'analisi XML puoi usare HTMLAgilePack

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



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché