如何使用html敏捷包解析一个简单的页面?

时间:2011-10-10 19:42:35

标签: c# .net parsing html-agility-pack

我正在尝试解析此page,但我没有太多唯一信息可以唯一标识我想要的部分。

基本上我正在尝试将大部分数据直接用于Flash视频。所以:

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 个答案:

答案 0 :(得分:3)

您可以选择您感兴趣的节点的ID:

        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 :(得分:1)

对于给定的<a>节点,要显示文字,请尝试.InnerText

现在您正在使用文档中所有<a>标记的内容。尝试缩小到只需要的那些。查找包含您所追踪的特定<a>标记的其他元素。例如,他们是否都坐在<div>的某个班级内?

E.g。如果您发现您感兴趣的<a>标记都位于<div class="foolinks">内,那么您可以执行以下操作: -

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

- UPDATE -

鉴于评论中的信息,我会尝试: -

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

- UPDATE -

如果您无法使其工作,请尝试将其拆分为变量赋值并逐步执行代码,检查每个变量以查看它是否符合您的预期。

E.g,

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

BTW - 我不确定.Id属性是否按照您的建议映射到节点的id属性。如果没有,您可以尝试使用dn => dn.Attributes["id"] == "exerciseDetails"