字符串到HtmlDocument

时间:2011-02-08 16:14:56

标签: c# html

我正在使用WebClient.DownloadString(url)通过URL获取html文档,但很难找到我正在寻找的元素内容。在阅读时,我发现HtmlDocument并且它有像GetElementById这样的整齐的东西。如何使用HtmlDocument返回的html填充url

7 个答案:

答案 0 :(得分:28)

使用Html Agility Pack as suggested by SLaks,这非常容易

string html = webClient.DownloadString(url);
var doc = new HtmlDocument();
doc.LoadHtml(html);

HtmlNode specificNode = doc.GetElementById("nodeId");
HtmlNodeCollection nodesMatchingXPath = doc.DocumentNode.SelectNodes("x/path/nodes");

答案 1 :(得分:24)

HtmlDocument类是本机IHtmlDocument2 COM接口的包装器 你不能从字符串中轻松创建它。

您应该使用HTML Agility Pack

答案 2 :(得分:18)

回答原来的问题:

HTMLDocument doc = new HTMLDocument();
IHTMLDocument2 doc2 = (IHTMLDocument2)doc;
doc2.write(fileText);
// now use doc

然后转换回字符串:

doc.documentElement.outerHTML;

答案 3 :(得分:9)

对于那些不想使用HTML敏捷包并希望使用原生.net代码从字符串中获取HtmlDocument的人来说,这里只是一篇关于how to convert string to HtmlDocument的好文章

这是使用的代码块

public System.Windows.Forms.HtmlDocument GetHtmlDocument(string html)
        {
            WebBrowser browser = new WebBrowser();
            browser.ScriptErrorsSuppressed = true;
            browser.DocumentText = html;
            browser.Document.OpenNew(true);
            browser.Document.Write(html);
            browser.Refresh();
            return browser.Document;
        }

答案 4 :(得分:3)

你可以通过以下方式得到一份文件:

 System.Net.WebClient wc = new System.Net.WebClient();

 System.IO.Stream stream = wc.OpenRead(url);
 System.IO.StreamReader reader = new System.IO.StreamReader(stream);
 string s = reader.ReadToEnd();

 HtmlDocument doc = new HtmlDocument();
 doc.LoadHtml(s);

所以你有getbiyid和getbyname ......但是你还有更好的选择 建议使用HTML Agility Pack。 f.e 你可以这样做:doc.DocumentNode.SelectNodes(xpathselector)  或正则表达式解析文档..

顺便问一下:为什么不用正则表达式? 。如果你能正确使用它太酷了......但xpath也非常强大......所以“选择你的毒药”

答案 5 :(得分:2)

我对Nikhil的答案做了一些修改以简化它。诚然,我还没有通过.net编译器运行它,而Nikhil在其中省略的行可能有很好的理由。但是,至少在我的用例(一个非常简单的页面)中,它们是不必要的。

我的用例是一个快速的Powershell脚本:

$htmlText = $(New-Object 
System.Net.WebClient).DownloadString("<URI HERE>") #Get the HTML document from a webserver
$browser = New-Object System.Windows.Forms.WebBrowser
$browser.DocumentText = $htmlText
$browser.Document.Write($htmlText)
$response = $browser.document

就我而言,这返回的是一个HTMLDocument对象,其中包含HTMLElement个对象,而不是返回一个__ComObject对象类型(在Powershell类代码中使用这是一个挑战)调用PS 5.1.14393.1944中的Invoke-WebRequest

我相信等效的C#代码是:

public System.Windows.Forms.HtmlDocument GetHtmlDocument(string html)
{
    WebBrowser browser = new WebBrowser();
    browser.DocumentText = html;
    browser.Document.Write(html);
    return browser.Document;
}

答案 6 :(得分:0)

您可以尝试使用OpenNew然后使用Write,但这对于该类有点奇怪。 More info on MSDN.