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