Как разобрать простую страницу с помощью html agility pack? - PullRequest
1 голос
/ 10 октября 2011

Я пытаюсь разобрать эту страницу , но у меня не так много уникальной информации, чтобы однозначно определить нужные мне разделы.

В основном я пытаюсь получить большую часть данных прямо на флэш-видео. Итак:

Alternating Floor Press

Type: Strength
Main Muscle Worked: Chest 
Other Muscles: Abdominals, Shoulders, Triceps 
Equipment: Kettlebells 
Mechanics Type: Compound
Level: Beginner
Sport: No
Force: N/A

А также ссылки на изображения, которые показывают состояния до и после.

Прямо сейчас я использую это:

HtmlAgilityPack.HtmlDocument doc = web.Load ( "http://www.bodybuilding.com/exercises/detail/view/name/alternating-floor-press" );
IEnumerable<HtmlNode> threadLinks = doc.DocumentNode.Descendants ( "a" );

foreach ( var link in threadLinks )
{
    string str = link.InnerHtml;
    Console.WriteLine ( str );
}

Это дает мне много вещей, которые мне не нужны, но также печатает то, что мне нужно. Должен ли я анализировать эти распечатанные данные, пытаясь определить, где могут быть мои данные цели?

Ответы [ 2 ]

3 голосов
/ 11 октября 2011

Вы можете выбрать идентификатор интересующих вас узлов:

        HtmlAgilityPack.HtmlWeb web = new HtmlWeb();
        HtmlAgilityPack.HtmlDocument doc = web.Load("http://www.bodybuilding.com/exercises/detail/view/name/alternating-floor-press");
        IEnumerable<HtmlNode> threadLinks = doc.DocumentNode.SelectNodes("//*[@id=\"exerciseDetails\"]");

        foreach (var link in threadLinks)
        {
            string str = link.InnerText;
            Console.WriteLine(str);
        }
        Console.ReadKey();
1 голос
/ 10 октября 2011

Для данного узла <a>, чтобы получить показанный текст, попробуйте .InnerText.

В данный момент вы используете содержимое всех тегов <a> в документе. Попробуйте сузить круг до тех, которые вам нужны. Посмотрите на другие элементы, которые содержат конкретные теги <a>, которые вы ищете. Например, они все сидят внутри <div> с определенным классом?

например. если вы найдете интересующие вас теги <a> внутри <div class="foolinks">, то вы можете сделать что-то вроде: -

IEnumerable<HtmlNode> threadLinks = doc.DocumentNode.Descendants("div")
    .First(dn => dn.Attributes["class"] == "foolinks").Descendants("a");

- ОБНОВЛЕНИЕ -

Учитывая информацию в вашем комментарии, я бы попробовал: -

IEnumerable<HtmlNode> threadLinks = doc.DocumentNode.Descendants("div")
    .First(dn => dn.Id == "exerciseDetails").Descendants("a");

- ОБНОВЛЕНИЕ -

Если у вас возникли проблемы с тем, чтобы заставить его работать, попробуйте разбить его на присваивания переменных и пройтись по коду, проверяя каждую переменную, чтобы убедиться, что она соответствует вашим ожиданиям.

например,

var divs = doc.DocumentNode.Descendants("div");
var div = divs.FirstOrDefault(dn => dn.Id == "exerciseDetails");
if (div == null)
{
    // couldn't find the node - do whatever is appropriate, e.g. throw an exception
}

IEnumerable<HtmlNode> threadLinks = div.Descendants("a");

Кстати, я не уверен, соответствует ли свойство .Id атрибуту id узла, как вы предлагаете. Если нет, вы можете попробовать dn => dn.Attributes["id"] == "exerciseDetails".

...