HtmlAgilityPack Helper class Instead of writing HtmlAgilityPack document code over and over, I've decided to create a helper class for HtmlAgilityPack that prevents me that problem and adds a dispose feature for HtmlDocuments.

What can I do better?

public class HtmlParser
{
    private ArrayList Documents { get; set; }

    public HtmlParser()
    {
        Documents = new ArrayList();
    }

    ~HtmlParser()
    {
        Dispose();
    }

    public string ParseNode(string page, string xPath, ParseType type, string attributes = null)
    {
        int index = Documents.Add(new HtmlDocument());
        ((HtmlDocument)Documents[index]).LoadHtml(page);
        HtmlNode node = ((HtmlDocument)Documents[index]).DocumentNode.SelectSingleNode(xPath);
        if (null != node) return type == ParseType.InnerHtml ? node.InnerHtml : type == ParseType.OuterHtml ? node.OuterHtml : type == ParseType.InnerText ? node.InnerText : node.Attributes[attributes].Value;
        return null;
    }

    public HtmlNode GetNode(string page, string xPath)
    {
        int index = Documents.Add(new HtmlDocument());
        ((HtmlDocument)Documents[index]).LoadHtml(page);
        return ((HtmlDocument) Documents[index]).DocumentNode.SelectSingleNode(xPath);
    }

    public HtmlNodeCollection GetNodes(string page, string xPath)
    {
        int index = Documents.Add(new HtmlDocument());
        ((HtmlDocument)Documents[index]).LoadHtml(page);
        return ((HtmlDocument)Documents[index]).DocumentNode.SelectNodes(xPath);
    }

    public void Dispose()
    {
        if (null != Documents)
            Documents.Clear();
        Documents = null;
        GC.Collect();
    }
}

public enum ParseType
{
    InnerHtml,
    OuterHtml,
    InnerText,
    Attribute
}
There are a few things I've noticed.


This line if (null != node) return type == ParseType.InnerHtml ? node.InnerHtml : type == ParseType.OuterHtml ? node.OuterHtml : type == ParseType.InnerText ? node.InnerText : node.Attributes[attributes].Value; is very confusing.  You are mixing and if statement with multiple ternary really clutters up that line of code.
You shoud look into the var keyword.  When the variable type is obvious, it is pretty much stand practise to use it.  I think it really cleans up code.
I'm not sure why you are using GC.Collect() in your constructor.  In C# there is not usually a need to control Garbage Collection.  The framework deals with it pretty well.
I would change if (null != Documents) to if (Documents != null).  I know why that syntax is done in C/C++, but in C# it is not needed, and the latter is much more descriptive and easier to understand.
I would be careful about returning null from a method.  It adds extra code where the method is called to check for null.  Maybe look into the null object design pattern


Other than that, your use of white space and indentation is very well done.  Makes reading your code much easier.