Données de nœud interne avec HtmlAgilityPack C #

.net c# html html-agility-pack parsing

Question

J'utilise HtmlAgilityPack pour lire des données / chaînes à partir d'une page Web.

Mon HTML est ici en violon

http://jsfiddle.net/7DWfa/1/

Voici mon code

HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.OptionFixNestedTags = true;
HtmlNode.ElementsFlags.Remove("option");
htmlDoc.LoadHtml(s);
if (htmlDoc.DocumentNode != null){
HtmlAgilityPack.HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode("//body");
if (bodyNode != null)
{//what to do here to get title and href?
var inputs = from input in htmlDoc.DocumentNode.Descendants("div")
                     where input.Attributes["class"].Value == "results-data-price-btn"
                     select input;

}
}

Merci de me guider pour obtenir les valeurs div via les classes

Réponse acceptée

Remarque : le texte ci-dessous n'a pas été testé. Je viens juste de regarder rapidement le code HTML de la page et de comprendre comment il s'intègre.

Chaque voiture "résultat" a un div avec la search-results-box classe. Alors....

var rootNode = htmlDoc.DocumentNode;
var allCarResults = rootNode.SelectNodes("//div[normalize-space(@class)='search-results-box']");
foreach (var carResult in allCarResults)
{

}

Vous avez chaque "résultat voiture" (comme dans chaque élément, il s'agit maintenant de la section entière qui représente l'une des voitures ... alors creusez plus loin ...

Dans chacune d'elles, les données de la voiture se div dans une autre div , avec la classe search-results-data ... so ....

var dataNode = carResult.SelectSingleNode(".//div[@class='search-results-data']");

Dans ce contexte, vous allez maintenant creuser encore plus profondément. Le titre de la voiture est dans un autre élément, en particulier chez un enfant h2 ...

var carNameNode = dataNode.SelectSingleNode(".//h2/a");
string carName = carNameNode.InnerText.Trim();

Le prix de la voiture est le plus difficile en raison de l'horrible balisage dans le code HTML.

Il se trouve dans un élément de font qui se trouve dans une autre div ...

var carPriceNode = dataNode.SelectSingleNode(".//div[@class='results-data-price-btn']/font");
string carPrice = carPriceNode.InnerText.Trim(); // this will give you AED 24,500. Perform some logic to split that up so you just have the number...a

Le problème est que le prix est collé ensemble comme "24.500 AED" dans un élément. Par conséquent, vous pouvez facilement obtenir l'élément, mais si vous voulez seulement le nombre, c'est la logique que vous devez comprendre.

L' image elle-même, c'est bien. C'est un niveau dans le balisage, remonter comme un enfant sous la carResult , alors on y va .....:

var carImageNode = carResult.SelectSingleNode(".//div[@class='search-results-img']/descendant::img");
string carImageSource = carImageNode.GetAttributeValue("src", string.Empty);

Rééditer

Toutes les « Plus de détails sur cette voiture d' occasion » information est bourrée dans un seul endroit, de sorte que le ci - dessous fonctionnera pour votre exemple , mais peut ne pas fonctionner pour tous:

var descriptionNode = rootNode.SelectSingleNode("//div[@id='description']");

var entireDescription = descriptionNode.InnerText.Trim();

var splitUpDescriptionParts =
    entireDescription.Split(
        new[]
            {
                "More Details about this Used Car:", "Body Condition:", "Mechanical Condition:", "Doors:", "Cylinders:", "Body Style:",
                "Drive Type:", "Warrenty:", "Description:"
            },
        StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).Where(s => !string.IsNullOrWhiteSpace(s));

string bodyCondition = splitUp.First();
string mechancialCondition = splitUp.ElementAt(1);
string amountOfDoors = splitUp.ElementAt(2);
string amountOfCylinders = splitUp.ElementAt(3);
string bodyStyle = splitUp.ElementAt(4);
string driveType = splitUp.ElementAt(5);
string warranty = splitUp.ElementAt(6);
string description = splitUp.Last();


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