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