Datos internos del nodo con HtmlAgilityPack C #

.net c# html html-agility-pack parsing

Pregunta

Estoy usando HtmlAgilityPack para leer datos / cadena de una página web.

Mi html está aquí en violín

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

Aqui esta mi codigo

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;

}
}

Por favor, guíame cómo obtener valores div a través de clases

Respuesta aceptada

Nota : lo siguiente no está probado, simplemente observé rápidamente el código HTML de la página y traté de entender cómo encaja.

El 'resultado' de cada automóvil tiene un div con el search-results-box clase. Asi que....

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

}

Tienes cada 'resultado del auto' (como en, cada elemento es ahora la sección completa que representa uno de los autos ... así que profundiza ...

Dentro de cada uno de estos, los datos del auto están dentro de otra div , con la clase search-results-data ... así que ...

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

Dentro de esto , ahora cavarás aún más profundo. El título del auto está dentro de otro elemento, específicamente dentro de un niño h2 ...

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

El precio del auto es más difícil gracias al horrible marcado en el HTML.

Se encuentra dentro de un elemento de font que está dentro de otra 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

El problema es que el precio está pegado como "AED 24,500" en un elemento. Por lo tanto, puede obtener fácilmente el elemento, pero si solo desea el número, esa es la lógica que deberá averiguar por sí mismo para hacerlo.

La imagen en sí, está bien. Ese es un nivel más alto en el marcado, una copia de seguridad como un niño debajo del carResult , así que subimos ...

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

Reeditar

Toda la información de 'Más detalles sobre este automóvil usado' se rellena en un solo lugar, por lo que la siguiente información funcionará para su ejemplo, pero es posible que no funcione para todos ellos:

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


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué