Парсинг HTML с помощью CSQuery

Как я могу получить значение из тега div через идентификатор с помощью CSQuery?

Например,

<h3>
    <div id='type'>
        Room 1
    </div>
    <div id='price'>
        145
    </div>
</h3>

В этом случае я хотел бы получить содержимое внутри type и price.


person bluewonder    schedule 28.02.2014    source источник
comment
@ShashankChaturvedi: я не знаю, как написать строку для получения содержимого, я пробовал dom.Select([id = lib_presta).Text(), но это не сработало   -  person bluewonder    schedule 28.02.2014


Ответы (1)


Хорошо, вот как это сделать на полном рабочем примере.

HTML

Это включает в себя ваш неверный/дублирующийся идентификатор html, который вы не можете контролировать.

var html = @"<h3>
            <div id='lib_presta'>
                Chambre standard 1 pers du <span class=''>03/03/2014</span>  au <span class=''>05/03/2014 </span>
            </div>
            <div id='prix_presta'>
                127.76 &euro;
            </div>
        </h3><h3>
            <div id='lib_presta'>
                Chambre standard 2 pers du <span class=''>03/03/2014</span>  au <span class=''>05/03/2014 </span>
            </div>
            <div id='prix_presta'>
                227.76 &euro;
            </div>
        </h3>";

Код C#

Это загружает элементы dom по их идентификаторам в два списка описаний и цен. Затем он проецирует их в список объектов HotelAvailability, используя значения ключей обеих коллекций в качестве свойств HotelName и Price.

        CQ dom = html;

        var libs = dom["#lib_presta"];
        var prixs = dom["#prix_presta"];

        var list = libs.Zip(prixs, (k, v) => new { k, v })
          .Select(h => new HotelAvailablity { HotelName = h.k.InnerText.Trim(), Price = h.v.InnerText.Trim() });

Снимок экрана

Запустите вышеуказанное в консольном приложении, чтобы проверить его.

person hutchonoid    schedule 28.02.2014
comment
Большое спасибо, я понял, но не могли бы вы подсказать мне, как вернуть эти значения, а затем установить их в список «Объект» и установить свойства? Могу ли я использовать .ToList() в этом случае? Спасибо - person bluewonder; 28.02.2014
comment
Конечно, не беспокойтесь. Если вы хотите получить все элементы div без использования идентификаторов, вы можете просто сделать следующее: var divList = dom[div].ToList(); - person hutchonoid; 28.02.2014
comment
Да, но я хочу установить имя и цену в качестве свойств и поместить их в класс объекта. теперь он просто получает все значения div со страницы html, и я хочу, чтобы они были разделены как имя и цена. List<HotelAvailability> list = new List<HotelAvailability>(); list.Add(new HotelAvailability() { HotelName = dom["#lib_presta"].Text(), Price = dom["#prix_presta"].Text() }); тогда он просто получает все значения в первый элемент списка. у вас есть идея разделить их на имя и цену? Спасибо @hutchonoid - person bluewonder; 28.02.2014
comment
Если я вас правильно понял, похоже, ваш дом неправильный. Вы возвращаете несколько имен HotelName из следующего запроса? дом[#lib_presta]. Это должен быть только один, так как это уникальный идентификатор, и подход, который вы упомянули выше, будет правильным. - person hutchonoid; 28.02.2014
comment
Если вы возвращаете несколько, вы можете добавить ценовой класс и использовать селектор класса (с . вместо #), чтобы получить цены, затем зациклить результат списка и добавить его в свою коллекцию. - person hutchonoid; 28.02.2014
comment
На самом деле названий отелей несколько, так как у меня есть несколько тегов div с одинаковым id=lib_presta, указывающим название отелей, и одинаковым для цены, так что в конце концов я получил один большой var, включающий все названия отелей и цены. поэтому я хочу разделить их на каждое имя в объекте HotelAvailability. Спасибо @hutchonoid - person bluewonder; 28.02.2014
comment
Большое спасибо @hutchonoid за вашу помощь, но тогда я столкнулся с другой проблемой, так как я не разрабатываю html-страницу, я просто проанализировал ее содержимое с другой стороны в Интернете, из-за этого html-страница не может быть изменена в этом кейс. Я работаю над тем, как разделить их после получения переменной всех названий отелей. - person bluewonder; 28.02.2014
comment
@bluewonder Нет проблем, я думаю, вы могли бы использовать тот же подход, но используя селектор идентификаторов. Думаю, он еще вернет коллекцию. Вы пытались использовать var libs = dom[#lib_presta]; var prixs = dom[#prix_presta]; Использование метода словаря, как указано выше? - person hutchonoid; 28.02.2014
comment
Да, но у меня есть одна проблема: var libs = dom[".lib_presta"];, которая возвращает целую коллекцию, содержащую все имена, полученные из всех идентификаторов тегов div lib_presta, то же самое по цене. так что для этого шага var libs = new List<string>() { "Desc 1", "Desc 2" }; я до сих пор не понимаю, как разделить их, а затем назначить каждому свойству в списке объектов. Спасибо @hutchonoid - person bluewonder; 28.02.2014
comment
@bluewonder Привет, я добавил полный рабочий пример. Пожалуйста, проголосуйте, если это работает для вас. :) - person hutchonoid; 28.02.2014
comment
Большое спасибо за вашу помощь, это был отличный пример, я буду тестировать его сейчас. хорошего дня и спасибо! - person bluewonder; 04.03.2014