HTML解析单个表/不是所有正在解析的数据?

时间:2013-03-31 18:57:01

标签: windows-phone-8 html-parsing html-agility-pack

对于Windows Phone 8开发而言,我是一个新手,我正在开发一些东西,作为我正在开发的应用程序的一部分。

现在我正在尝试解析来自RuneScape 07 High Scores等网站的信息 - http://services.runescape.com/m=hiscore_oldschool/hiscorepersonal.ws?user1=zezima

我正在使用HTML Agility Pack并且我能够解析一些数据(直到Woodcutting),但是任何传递的东西都没有出现? (这是我的ListBox的大小吗?)

理想情况下,我希望能够单独解析表信息,而不是像这样解析一个块:

public MainPage()
    {
        InitializeComponent();
        HtmlWeb.LoadAsync("http://services.runescape.com/m=hiscore_oldschool/hiscorepersonal.ws?user1=zezima", DownLoadCompleted);
    }

    void DownLoadCompleted(object sender, HtmlDocumentLoadCompleted e)
    {
        if(e.Error == null)
        {
            HtmlDocument doc = e.Document;
            if (doc != null)
            {
                var result = doc.DocumentNode.SelectNodes("//div[@id='contentHiscores']");
               foreach (var htmlNode in result)
               {
                   lBox.Items.Add(htmlNode.InnerText);
               }
            }
        }

但是,如果我尝试使用

访问单个表,例如此表
var result = doc.DocumentNode.SelectNodes("//div[@id='contentHiscores']/table/tbody/tr[5]/td[2]");

我收到NullReferenceException。

这是可能的,还是我做错了什么?

1 个答案:

答案 0 :(得分:0)

您可能依赖于开发工具(如FireBug或Chrome等)来确定您所关注节点的XPATH。

你可以'真的这样做,因为这些工具给出的XPATH对应于内存中的HTML DOM,而Html Agility Pack只知道服务器发回的原始HTML。

您需要做的是查看发回的内容(或只是查看源代码)。你会看到没有TBODY元素。所以你想找到任何有区别的东西,例如使用XPATH axes

这是一个似乎有用的代码:

// get all TD nodes with ALIGN attribute set to left
foreach (var node in doc.DocumentNode.SelectNodes("//div[@id='contentHiscores']//td[@align='left']"))
{
    var item = lBox.Items.Add(node.InnerText.Trim());
    // use an 'XPATH axe': get all sibling TD nodes with ALIGN attribute set to 'right'
    foreach (var sibling in node.SelectNodes("following-sibling::td[@align='right']"))
    {
        item.SubItems.Add(sibling.InnerText.Trim());
    }
}