Script that parses the Chase.com page for my recent payments
Single responibility principle  

You method violates the SRP because it does to many things. 


it parses HtmlElements for 3 different types  
it validates the resulting List&lt;T&gt;  
updates the UI  




If you need comments like  


//Parse for date
//Parse for description
//...  



then it is a clear sign that these parts should be extracted to separate methods.  

A much cleaner way would be  

private const string dateRegexPattern = @"^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d$"
private List&lt;string&gt; ParseForPurchaseDates(HtmlDocument document)
{
    var purchaseDates = new List&lt;string&gt;();

    var links = document.GetElementsByTagName("span");

    foreach (HtmlElement link in links)
    {
        if (link.InnerText == null) { continue; }

        string inner = link.InnerText.Trim();
        if (inner == "Pending" || Regex.IsMatch(inner,dateRegexPattern ))
        {
            purchaseDates.Add(inner);
        }

    }
    return purchaseDates;
}


if you do this for the other parsings too, your click eventhandler could look like  

private void stepBtn_Click(object sender, EventArgs e)
{
    List&lt;string&gt; date = ParseForPurchaseDates(wb.Document);
    List&lt;string&gt; desc = ParseForPurchaseDescriptions(wb.Document);
    List&lt;double&gt; amt = ParseForPurchaseAmounts(wb.Document);

    if (ListCountIsValid(date, desc, amt))
    {
        // update the UI
        return;
    }

    MessageBox.Show("The three arrays do not have the same length.\n\nDate: " + date.Count + "\nAmt: " + amt.Count + "\nDesc: " + desc.Count, Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}

private bool ListCountIsValid(List&lt;string&gt; purchaseDates, List&lt;string&gt; purchaseDescriptions, List&lt;double&gt; purchaseAmounts)
{
    return purchaseDates.Count == purchaseAmounts.Count  
        &amp;&amp; purchaseDescriptions.Count == purchaseAmounts.Count;
}  




For the parsing of the amount I would like to suggest to add a second parameter which should be optional to replace the hardcoded value 1000.  

private List&lt;double&gt; ParseForPurchaseAmounts(HtmlDocument document, double maxAmount = 1000d)
{
    //....
}  




Naming  

Naming is a very important part of programming. Using abbreviations instead of the complete word will reduce readability and makes it hard to maintain. So give Bob the maintainer a chance to do his/her job easy and fast by using proper names.  

amt should be e.g amounts or purchaseAmounts ...