Analyser le HTML interne

c# html-agility-pack html-parsing

Question

C'est ce que je veux analyser

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

J'utilise XPath suivant pour le trouver

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

C’est bien et je reviens, s me all div, s avec photobox class

Mais quand je veux obtenir ahref en utilisant

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

J'ai un jeton invalide d'erreur.

J'ai aussi essayé d'utiliser une requête

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

Est-ce que quelqu'un me dira comment écrire XPath ou une requête pour obtenir ce AHref

Réponse acceptée

Cela fonctionne (testé):

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

Le problème est que vous aviez mélangé sélecteurs d'attributs et d'éléments. Également de votre part, vous vous demandez s'il est difficile de savoir si vous aviez vraiment l'intention d'interroger une collection .

Le sélecteur XPath ci - dessus permet de sélectionner tous a des éléments qui ont un href attribut qui sont des noeuds enfants d'un div élément avec une classe de 'photoBox pB-ms' . Vous pouvez ensuite itérer cette collection et obtenir la href attribut href de chaque élément.

De plus, HtmlAgilityPack supporte maintenant Linq (depuis la version 1.4), il serait donc plus facile d'obtenir une valeur d'attribut particulière (imo) comme ceci:

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

Réponse populaire

Au lieu de l'analyse XML, vous pouvez utiliser HTMLAgilePack

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi