2011-03-29 20 views
6

Quiero extraer un par de enlaces de una página html descargada de Internet, creo que usar linq para XML sería una buena solución para mi caso.
Mi problema es que no puedo crear un XmlDocument del HTML, usando Carga (String url) no funcionó lo que he descargado el html en una cadena mediante:¿Cómo se lee HTML como XML?

public static string readHTML(string url) 
    { 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 
     HttpWebResponse res = (HttpWebResponse)req.GetResponse(); 
     StreamReader sr = new StreamReader(res.GetResponseStream()); 

     string html = sr.ReadToEnd(); 
     sr.Close(); 
     return html; 
    } 

cuando intento cargar ese cadena usando LoadXml (cadena XML) consigo la excepción

'--' is an unexpected token. The expected token is '>' 

¿Por qué camino debo tomar para leer el archivo html en un XML parsable

+5

HTML no tiene que ser necesariamente una válida XML. HTML se basa en SGML, que a su vez es un superconjunto (tipo de) de XML. Por lo tanto, necesita un analizador HTML especial, no un analizador XML genérico. –

+0

Más de lo mismo de las respuestas a continuación y comentario anterior. HTML no es XML –

Respuesta

12

HTML, simplemente no es lo mismo como XML (a menos que el HTML realidad pasa a ser compatible con XHTML o HTML5 en modo XML). La mejor manera es usar un HTML parser para leer el HTML. Luego puede transformarlo a Linq en XML, o procesarlo directamente.

3

HTML no es XML. HTML está basado en SGML, y como tal no garantiza que el marcado sea XML bien formado (XML es un subconjunto de SGML). Solo puede analizar XHTML, es decir, XML compatible con HTML, como XML. Pero, por supuesto, ese no es el caso para la mayoría de los sitios web.

Para trabajar con HTML, debe usar un analizador HTML.

+0

Si pudiera marcar dos respuestas marcaría ambas respuestas. – Ziv

0

Si conoce los nodos que le interesan, usaré la expresión regular para extraer los enlaces de la cadena.

+6

Las expresiones regulares casi nunca son un enfoque sensato para analizar HTML o XML –

+1

Lo he pensado, pero nunca aprendí sobre expresiones regulares y es un tema demasiado importante para aprender para una tarea tan pequeña. – Ziv

+1

https://stackoverflow.com/a/1732454/321973 –

9

No lo he usado, pero sugiero que eche un vistazo a SGMLReader. He aquí una muestra de su página de inicio:

XmlDocument FromHtml(TextReader reader) { 

    // setup SgmlReader 
    Sgml.SgmlReader sgmlReader = new Sgml.SgmlReader(); 
    sgmlReader.DocType = "HTML"; 
    sgmlReader.WhitespaceHandling = WhitespaceHandling.All; 
    sgmlReader.CaseFolding = Sgml.CaseFolding.ToLower; 
    sgmlReader.InputStream = reader; 

    // create document 
    XmlDocument doc = new XmlDocument(); 
    doc.PreserveWhitespace = true; 
    doc.XmlResolver = null; 
    doc.Load(sgmlReader); 
    return doc; 
} 
+0

+1 He usado SGMLReader durante muchos años (desde que se introdujo). Es muy robusto y puede manejar algunos HTML malformados. –

1

Si desea extraer algunos enlaces de una página, como usted ha mencionado, trate de usar HTML Agility Pack.

Este código obtiene una página de la web y extrae todos los enlaces:

HtmlWeb web = new HtmlWeb(); 
HtmlDocument document = web.Load("http://www.stackoverflow.com"); 
HtmlNode[] links = document.DocumentNode.SelectNodes("//a").ToArray(); 

abre un archivo HTML desde el disco y obtener la URL de enlace específico:

HtmlDocument document2 = new HtmlDocument(); 
document2.Load(@"C:\Temp\page.html") 
HtmlNode link = document2.DocumentNode.SelectSingleNode("//a[@id='myLink']"); 
Console.WriteLine(link.Attributes["href"].Value); 
Cuestiones relacionadas