2013-06-20 2 views
0

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

Мой 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; 

} 
} 

Пожалуйста Guid мне, как получить Дивы значения с помощью классов

+0

Название и Href чего? – Arran

+0

Если вы просто заглянете в http://jsfiddle.net/7DWfa/2/, то есть информация, как название цены и изображение src, я хочу получить их –

+0

@Arran: я обновил свой вопрос .. я пробовал много способов, но нет удачи ... –

ответ

0

Примечания: ниже непроверено, я только что быстро просмотрел 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 

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

image сам, это прекрасно. Это уровень в разметке, обратно вверх, как ребенок под carResult, поэтому до нас идти .....:

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

Re-редактировать

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

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

Это дает мне «Ссылка на объект не установлена ​​в экземпляр объекта». on foreach loop –

+0

См. мое редактирование, имя класса в окружающем div на самом деле имеет место в конце, поэтому ничего не найдет, поэтому я изменил XPath сверху, чтобы заставить его удалить пробелы из класса имя. – Arran

+0

: Спасибо, сработало ... Могу ли я перейти на страницу с подробной ссылкой? –

Смежные вопросы