Ich verwende HtmlAgilityPack, um Daten / Strings von einer Webseite zu lesen.
Mein HTML ist hier in Geige
Hier ist mein 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;
}
}
Bitte leiten Sie mir, wie Sie Div-Werte über Klassen erhalten können
Hinweis : das Folgende ist ungetestet, ich habe mir nur kurz das HTML der Seite angesehen und versucht zu verstehen, wie es zusammenpasst.
Jedes Auto 'result' hat ein div
mit der Klassensuche search-results-box
. Damit....
var rootNode = htmlDoc.DocumentNode;
var allCarResults = rootNode.SelectNodes("//div[normalize-space(@class)='search-results-box']");
foreach (var carResult in allCarResults)
{
}
Sie haben jedes "Auto-Ergebnis" (wie in jedem Artikel ist jetzt der gesamte Abschnitt, der eines der Autos darstellt ... also tiefer graben ....
In jedem von diesen sind die Daten des Autos in einem anderen div
, mit den Klassen- search-results-data
... so ....
var dataNode = carResult.SelectSingleNode(".//div[@class='search-results-data']");
Innerhalb dieser werden Sie jetzt noch tiefer graben. Der Titel des Autos ist in einem anderen Element, insbesondere in einem Kind h2
...
var carNameNode = dataNode.SelectSingleNode(".//h2/a");
string carName = carNameNode.InnerText.Trim();
Der Preis des Autos ist am schwierigsten dank der schrecklichen Markup im HTML.
Es sitzt in einem font
Element, das in einem anderen 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
Das Problem ist, dass der Preis als "AED 24.500" in einem Element zusammenhängt. Daher können Sie leicht das Element erhalten, aber wenn Sie nur die Zahl wollen, ist das Logik, die Sie selbst herausfinden müssen.
Das Bild selbst ist in Ordnung. Das ist ein Level in der carResult
, als Kind unter dem carResult
, also gehen wir .....:
var carImageNode = carResult.SelectSingleNode(".//div[@class='search-results-img']/descendant::img");
string carImageSource = carImageNode.GetAttributeValue("src", string.Empty);
Erneut bearbeiten
Alle Informationen zu 'Weitere Informationen zu diesem Gebrauchtwagen' sind an einem Ort zusammengetragen, so dass das Folgende für Ihr Beispiel funktioniert, aber möglicherweise nicht für alle funktioniert:
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();