Внутренние данные узла с помощью HtmlAgilityPack C #

.net c# html html-agility-pack parsing

Вопрос

Я использую HtmlAgilityPack для чтения данных / строки с веб-страницы.

Мой html здесь, в скрипке

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

Вот мой код

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;

}
}

Пожалуйста, подскажите мне, как получить значения div через классы

Принятый ответ

Примечание : ниже непроверено, я просто быстро просмотрел HTML-страницу и попытался понять, как он «подходит» вместе.

У каждого автомобиля «результат» есть div с search-results-box класса. Так....

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

}

У вас есть каждый «результат автомобиля» (как в, каждый элемент теперь представляет собой весь раздел, который представляет собой один из автомобилей ... так что копайте глубже ....

Внутри каждого из этих данных данные автомобиля находятся в пределах другого div , с классом search-results-data ... так ....

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

В этом случае вы будете копать еще глубже. Название автомобиля находится в пределах другого элемента, в частности, у ребенка h2 ...

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

Цена автомобиля сложнее благодаря ужасной разметке в HTML.

Он находится внутри элемента font который находится внутри другого 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

Проблема в том, что цена застревает вместе как «AED 24,500» в одном элементе. Поэтому вы можете легко получить элемент, но если вы хотите только номер, это логика, которую вам нужно будет выяснить для себя.

Само изображение , отлично. Это уровень вверх по разметке, резервное копирование как ребенок под carResult , так что мы идем .....:

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

Повторное редактирование

Вся информация об «более подробной информации об этом подержанном автомобиле» заполняется в одном месте, поэтому ниже будет работать для вашего примера, но может не работать для всех из них:

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


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему