字符串到 HtmlDocument

Posted

技术标签:

【中文标题】字符串到 HtmlDocument【英文标题】:String to HtmlDocument 【发布时间】:2011-06-23 13:19:42 【问题描述】:

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

【问题讨论】:

+1 表示不尝试正则表达式。 @SLaks 为什么会这样? @corei11: ***.com/a/1732454/34397 【参考方案1】:

HtmlDocument 类是原生IHtmlDocument2 COM 接口的包装器。 您不能轻松地从字符串创建它。

您应该使用HTML Agility Pack。

【讨论】:

由于@dhsto 已经对这个问题给出了准确的答案,我看不出这个答案是如何正确的。【参考方案2】:

使用 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");

【讨论】:

【参考方案3】:

回答原来的问题:

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

然后转回字符串:

doc.documentElement.outerHTML;

【讨论】:

好像不能像这样实例化HTMLDocument @Steinfeld 我刚刚做了另一个测试,它对我有用。确保您是using mshtml;。在参考对话中是Microsoft.mshtml。我正在使用版本7.0.3300 谢谢,我几个小时前就做了,它确实奏效了。但是我尝试了敏捷包,它看起来很“用户友好”=] @Steinfeld 是的,绝对是! mshtml 库是一个巨大的痛苦,但它对于做简单的事情已经足够了。 这可行,但它会尝试在我的环境中打开一个外部about:blank 页面。【参考方案4】:

对于那些不想使用 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;
        

【讨论】:

我不再在 .NET 环境中工作,因此无法测试它是否有效。但是,如果社区中的其他人可以为我验证这一点,我会很乐意接受它作为答案。谢谢你这么多年捡到这个! XD 其实我一直在寻找这个解决方案,但是在没有第三方库的情况下没有得到任何解决方案。最后,这段代码对我有用,并在可能的应用程序中使用它。我希望这会帮助像我这样的人:)【参考方案5】:

我已经对 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 对象,而不是通过调用 Invoke-WebRequest 返回的 __ComObject 对象类型(在 powershell 类代码中使用是一个挑战) PS 5.1.14393.1944

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

public System.Windows.Forms.HtmlDocument GetHtmlDocument(string html)

    WebBrowser browser = new WebBrowser();
    browser.DocumentText = html;
    browser.Document.Write(html);
    return browser.Document;

【讨论】:

这很好,但是您需要运行: [void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms") 才能创建 System.Windows.Forms.WebBrowser对象 @Frank Lesniak 你确定这不依赖于版本吗?我不需要使用 loadwithpartialname,除非我调用的 DLL 不是 .net 程序集缓存的一部分。我当然没有在这段代码(powershell 版本)中使用它。或者您是说 C# 代码需要调用?我本来希望有一个项目库和一个 using 语句。 嘿,Takophiliac,你可能正在做点什么。在 PowerShell 5.1 上,我也可以创建一个新的 System.Net.WebClient 对象。不幸的是,我不记得我在测试什么版本......但我做了很多低级/向后兼容的工作,所以它很可能是 PowerShell v1 或 v2。【参考方案6】:

您可以通过以下方式获取 htmldocument:

 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 敏捷包。 f.e 你可以这样做: doc.DocumentNode.SelectNodes(xpathselector) 或正则表达式来解析文档..

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

【讨论】:

HtmlDocument 对我来说似乎没有 .LoadHtml() @Photonic 但对我来说确实如此。在这里工作。 @C4u 你的HtmlDocument 在什么命名空间?我正在使用System.Windows.Forms.HtmlDocument,但没有LoadHtml() 我们得到了不同之处。它是HtmlAgilityPack.HtmlDocument【参考方案7】:

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

【讨论】:

但是根本无法创建实例。这需要一个现有的实例。 我把它放在表单的加载处理程序中:webBrowser1.DocumentText = Properties.Resources.HtmlContent; @SLaks wb = new webbrower(); wb.DocumentText(""); htmldoc = wb.Document().OpenNew(true); htmldoc.Write("");

以上是关于字符串到 HtmlDocument的主要内容,如果未能解决你的问题,请参考以下文章

Delphi TMemoryStream写入到字符串和字符串写入到流

请教下,怎么查到数组中,某个字符串,在数组中的索引位置?

图像到字节数组到字符串(反之亦然)

C语言试题四十五之把第1到第p个字符,平移到字符串的最后,把第p+1到最后的字符移到字符串的前部。

C语言试题四十五之把第1到第p个字符,平移到字符串的最后,把第p+1到最后的字符移到字符串的前部。

字符串到十六进制-十六进制到字符串转换