我如何使用HtmlAgilityPack?

时间:2014-08-15 20:01:42

标签: c# html-agility-pack

我正在制作一个项目,其中我需要从HTML页面中删除一些数据(duh),但我向上帝发誓,我还没有能够在网上找到一个新的友好示例。我尝试了一些不同的代码块,每次尝试与在线示例模糊不同的东西时,都会收到System.NullReferenceException错误。

首先,这是我的#34;加载代码",其中我初始化我的HtmlDocument对象和html本身。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Net;
using HtmlAgilityPack;

namespace AltFinder
{
    public partial class Form1 : Form
    {
        public volatile HtmlAgilityPack.HtmlDocument document;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Get the HTML of a page
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://wikipedia.org/");

            // Return it in string form
            string response = (new StreamReader((req.GetResponse()).GetResponseStream()).ReadToEnd());

            // Make an HtmlDoc object, becase it cant parse from a string
            // Turn that string into that parsable object
            document.LoadHtml(response);
        }
    }
}

获取HTML本身并不是问题所在。当我试图解析它我做错了事时。由于我似乎无法找到任何关于HtmlAgilityPack的难以记录的文档,所以每个人似乎都有自己寻找特定节点的方法。作为一个新手,我试图掌握这个图书馆的基础知识,如果没有一个适合所有类型的交易,这可能很难。以下是我试图做的一个例子。

List<string> list = new List<string>();
var smallTags = document.DocumentNode.SelectNodes("//em");
if (smallTags != null)
{
    foreach (var small_tag in smallTags)
    {
        list.Add(small_tag.InnerHtml);
    }
}

在这种情况下,我尝试遍历页面中的每个em节点,如果节点不为空,则将其添加到列表中。我得到一个System.NullReference异常。我见过人们使用DocumentNode.Descendents,DocumentNode.SelectNodes和其他一些人。为什么用一个而不是另一个?我应该使用它们中的任何一个吗?我错过了什么?

我的问题是:我做错了什么?有人可以做一个简单的刮刀吗?即使它是长期和/或低效的方式,我正在寻找一些单行来提取我需要的数据。提前谢谢!

0 个答案:

没有答案