Je récupère le document html par URL en utilisant WebClient.DownloadString(url)
mais il est très difficile de trouver le contenu de l'élément que je recherche. En lisant autour, j'ai repéré HtmlDocument
et qu'il a des choses intéressantes comme GetElementById
. Comment puis-je remplir un HtmlDocument
avec le code HTML renvoyé par url
?
La classe HtmlDocument
est un wrapper autour de l'interface COM native IHtmlDocument2
.
Vous ne pouvez pas facilement le créer à partir d'une chaîne.
Vous devez utiliser le HTML Agility Pack .
En utilisant Html Agility Pack comme suggéré par SLaks , cela devient très facile:
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");
Pour répondre à la question d'origine:
HTMLDocument doc = new HTMLDocument();
IHTMLDocument2 doc2 = (IHTMLDocument2)doc;
doc2.write(fileText);
// now use doc
Puis pour reconvertir en chaîne:
doc.documentElement.outerHTML;
Pour ceux qui ne veulent pas utiliser le pack d'agilité HTML et veulent obtenir HtmlDocument à partir d'une chaîne en utilisant uniquement du code natif .net, voici un bon article sur comment convertir une chaîne en HtmlDocument
Voici le bloc de code à utiliser
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;
}
vous pouvez obtenir un document htmld en:
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);
vous avez donc getbiyid et getbyname ... mais plus vous feriez mieux avec
Pack d'agilité HTML comme suggéré. f.e vous pouvez faire: doc.DocumentNode.SelectNodes (xpathselector) ou regex pour analyser le doc.
btw: pourquoi pas regex? . c'est tellement cool si vous pouvez l'utiliser correctement ... mais xpath est aussi très puissant ... alors "choisissez votre poison"
cu
J'ai quelque peu adapté la réponse de Nikhil pour la simplifier. Certes, je ne l'ai pas exécuté via un compilateur .net et il y a probablement de très bonnes raisons pour les lignes que Nikhil a mises dans lesquelles j'ai omis. Cependant, au moins dans mon cas d'utilisation (une page très simple), ils n'étaient pas nécessaires.
Mon cas d'utilisation était pour un script PowerShell rapide:
$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
Pour mon cas, cela a renvoyé un objet HTMLDocument
contenant des objets HTMLElement
, au lieu de __ComObject
types d'objets (difficiles à utiliser dans le code de classe powershell) renvoyés par un appel à Invoke-WebRequest
dans PS 5.1.14393.1944
Je crois que le code C # équivalent est:
public System.Windows.Forms.HtmlDocument GetHtmlDocument(string html)
{
WebBrowser browser = new WebBrowser();
browser.DocumentText = html;
browser.Document.Write(html);
return browser.Document;
}
Vous pouvez essayer avec OpenNew puis avec Write, mais c'est une utilisation un peu étrange de cette classe. Plus d'informations sur MSDN.