我正在尝试在控制台应用程序中使用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);
}
}
}
}
答案 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执行此操作,如果您只需要锚标记。