C#.net使用Console中的HTMLDocument?

时间:2009-11-22 04:21:48

标签: c# .net console

我正在尝试在控制台应用程序中使用System.Windows.Forms.HTMLDocument。首先,这甚至可能吗?如果是这样,我如何将网页从网页加载到其中?我试图使用WebBrowser,但它告诉我:

  

未处理的例外情况:   System.Threading.ThreadStateException:   ActiveX控件'885   6f961-340a-11D0-A96B-00c04fd705a2'   无法实例化,因为   当前的读数不在   单线程公寓。

HTMLDocument对象上似乎缺乏相关教程(或者谷歌只会产生无用的结果)。


刚刚发现了mshtml.HTMLDocument.createDocumentFromUrl,但这让我感到兴奋

  

未处理的例外情况:   System.Runtime.InteropServices.COMException   (0x80010105):服务器扔了一个   例外。 (HRESULT的例外情况:   0x80010105(RPC_E_SERVERF AULT))at   System.RuntimeType.ForwardCallToInvokeMember(字符串   memberName,BindingFla gs标志,   对象目标,Int32 [] aWrapperTypes,   MessageData&安培; msgData)at   mshtml.HTMLDocumentClass.createDocumentFromUrl(字符串   bstrUrl,String bstr Options)at   iget.Program.Main(String [] args)

到底是什么?我想要的只是页面上<a>标签的列表。为什么这么难?


对于那些好奇的人,这是我提出的解决方案,感谢TrueWill

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using HtmlAgilityPack;

namespace iget
{
    class Program
    {
        static void Main(string[] args)
        {
            WebClient wc = new WebClient();
            HtmlDocument doc = new HtmlDocument();
            doc.Load(wc.OpenRead("http://google.com"));
            foreach(HtmlNode a in doc.DocumentNode.SelectNodes("//a[@href]"))
            {
                Console.WriteLine(a.Attributes["href"].Value);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:6)

作为替代方案,您可以使用免费的Html Agility Pack库。这可以解析HTML并允许您使用LINQ查询它。我在家里使用旧版本的项目,效果很好。

编辑:您可能还想使用WebClient或WebRequest类下载网页。请参阅Web scraping in .NET上的博文。 (请注意,我没有在控制台应用程序中尝试过此操作。)

答案 1 :(得分:3)

将[STAThread]属性添加到Main方法

    [STAThread]
    static void Main(string[] args)
    {
    }

那应该解决它。

答案 2 :(得分:-1)

如果是xhtml将其加载到XDocument并解析锚标签,或者您也可以使用RegEx执行此操作,如果您只需要锚标记。