Sto usando HtmlAgilityPack per leggere dati / stringa da una pagina web.
Il mio html è qui in fiddle
Ecco il mio codice
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;
}
}
Per favore guidami come ottenere i valori div attraverso le classi
Nota : il sotto non è stato testato, ho appena guardato l'HTML della pagina e ho cercato di capire come si "adatta" insieme.
Ogni "risultato" dell'auto ha un div
con la search-results-box
della classe. Così....
var rootNode = htmlDoc.DocumentNode;
var allCarResults = rootNode.SelectNodes("//div[normalize-space(@class)='search-results-box']");
foreach (var carResult in allCarResults)
{
}
Hai ogni "risultato auto" (come in, ogni elemento è ora l'intera sezione che rappresenta una delle macchine ... quindi scavare più in profondità ....
All'interno di ciascuno di questi, i dati dell'auto si trovano all'interno di un altro div
, con i dati di search-results-data
della classe ... quindi ....
var dataNode = carResult.SelectSingleNode(".//div[@class='search-results-data']");
All'interno di questo , ora scaverai ancora più a fondo. Il titolo dell'auto è all'interno di un altro elemento, in particolare all'interno di un bambino h2
...
var carNameNode = dataNode.SelectSingleNode(".//h2/a");
string carName = carNameNode.InnerText.Trim();
Il prezzo dell'auto è più difficile grazie alla marcatura orribile nell'HTML.
Si trova all'interno di un elemento font
che si trova all'interno di un altro 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
Il problema è che il prezzo è bloccato insieme come "AED 24.500" in un elemento. Quindi puoi facilmente ottenere l'elemento, ma se vuoi solo il numero, è logico che dovrai capire da solo.
L' immagine stessa, va bene. Questo è un livello superiore nel markup, il backup di un bambino sotto la carResult
, quindi andiamo .....:
var carImageNode = carResult.SelectSingleNode(".//div[@class='search-results-img']/descendant::img");
string carImageSource = carImageNode.GetAttributeValue("src", string.Empty);
Re-edit
Tutte le informazioni "Ulteriori dettagli su questa macchina usata" sono inserite in un'unica posizione, quindi il seguente funzionerà per il tuo esempio ma potrebbe non funzionare per tutti:
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();