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

本文关键字:html 何解析 简单 一个 | 更新日期: 2023-09-27 18:10:58

我正在尝试解析这个页面,但是没有太多的独特信息让我唯一地识别我想要的部分。

基本上,我正试图得到大部分的数据正确的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 );
}

这给了我很多我不需要的东西,但也打印了我需要的东西。我是否应该通过尝试查看目标数据可能在其中的位置来解析这个打印数据?

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

您可以选择您感兴趣的节点的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();

对于给定的<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");

BTW -我不确定.Id属性是否映射到节点的id属性,正如你建议的那样。如果没有,可以试试dn => dn.Attributes["id"] == "exerciseDetails"