字符串到 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到最后的字符移到字符串的前部。