web-dev-qa-db-fra.com

Chaîne en HtmlDocument

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?

28
lappy

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 .

24
SLaks

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");
29
Dan Tao

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;
20
David Sherret

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;
        }
10
Nikhil Gaur

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

3
womd

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;
}
2
Takophiliac

Vous pouvez essayer avec OpenNew puis avec Write, mais c'est une utilisation un peu étrange de cette classe. Plus d'informations sur MSDN.

0
Beku