c# - w3schools - razor html
Cadena a HtmlDocument (7)
Estoy recuperando el documento html por URL usando WebClient.DownloadString(url)
pero luego es muy difícil encontrar el contenido del elemento que estoy buscando. Mientras leía, he visto HtmlDocument
y que tiene cosas GetElementById
como GetElementById
. ¿Cómo puedo rellenar un HtmlDocument
con el html devuelto por url
?
Al usar Html Agility Pack como lo sugiere SLaks , esto se vuelve muy fácil:
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");
He adaptado un poco la respuesta de Nikhil para simplificarla. Es cierto que no lo he ejecutado a través de un compilador .net y que hay muy buenas razones para las líneas que Nikhil puso en las que he omitido. Sin embargo, al menos en mi caso de uso (una página muy simple) eran innecesarios.
Mi caso de uso fue para un script rápido de 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
En mi caso, esto devolvió un objeto HTMLDocument
con objetos HTMLElement
, en lugar de los tipos de objeto __ComObject
(que son un desafío para usar en el código de clase powershell) devuelto por una llamada a Invoke-WebRequest
en PS 5.1.14393.1944
Creo que el código C # equivalente es:
public System.Windows.Forms.HtmlDocument GetHtmlDocument(string html)
{
WebBrowser browser = new WebBrowser();
browser.DocumentText = html;
browser.Document.Write(html);
return browser.Document;
}
La clase HtmlDocument
es un contenedor alrededor de la interfaz COM nativa IHtmlDocument2
.
No puedes crearlo fácilmente desde una cadena.
Debe utilizar el paquete de agilidad HTML .
Para aquellos que no quieren usar el paquete de agilidad de HTML y desean obtener HtmlDocument de una cadena usando el código .net nativo, solo aquí hay un buen artículo sobre cómo convertir una cadena a HtmlDocument.
Aquí está el bloque de código para usar
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;
}
Para responder a la pregunta original:
HTMLDocument doc = new HTMLDocument();
IHTMLDocument2 doc2 = (IHTMLDocument2)doc;
doc2.write(fileText);
// now use doc
Luego para convertir de nuevo a una cadena:
doc.documentElement.outerHTML;
Puedes probar con OpenNew y luego con Write, pero es un uso un poco extraño de esa clase. Más información en MSDN.
usted podría obtener un htmldocument por:
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);
así que tienes getbiyid y getbyname ... pero cuanto más te gustaría con
Paquete de agilidad HTML como se sugiere. Puede hacerlo: doc.DocumentNode.SelectNodes (xpathselector) o regex para analizar el documento.
por cierto: ¿por qué no regex? . es genial si puedes usarlo correctamente ... pero xpath también es muy poderoso ... así que "elige tu veneno"
cu