extraer texto de

...

etiqueta o directamente desde un archivo HTML

asp.net c# html html-agility-pack regex

Pregunta

Tengo una página HTML que contiene algunos nombres de archivos que quiero descargar de un servidor web. Necesito leer estos nombres de archivo para crear una lista que se pasará a mi aplicación web que descarga el archivo desde el servidor. Estos nombres de archivo tienen alguna extensión.

He investigado sobre este tema, pero no he dado a conocer nada excepto ...

  1. Regex no se puede utilizar para analizar HTML.
  2. Usa HTML Agility Pack

¿No hay otra manera para que pueda buscar texto que tenga un patrón como filename.ext de un archivo HTML?

Ejemplo de HTML que contiene nombre de archivo -

 <p class=3DMsoNormal style=3D'margin-top:0in;margin-right:0in;margin-bottom=:0in; margin-left:1.5in;margin-bottom:.0001pt;text-indent:-.25in;line-height:normal;mso-list:l1 level3 lfo8;tab-stops:list 1.5in'><![if !supportLists]> <span style=3D'font-family:"Times New Roman","serif";mso-fareast-font-family:"Times New Roman"'><span style=3D'mso-list:Ignore'>1.<span style=3D'font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    </span></span></span><![endif]><span style=3D'font-family:"Times New Roman","serif"; mso-fareast-font-family:"Times New Roman"'>**13572_PostAccountingReport_2009-06-03.acc**<o:p></o:p></span></p>

No puedo usar HTML Agility Pack porque no puedo descargar y hacer uso de ninguna aplicación o herramienta.

¿Esto no puede lograrse por otra lógica?

Esto es lo que he hecho hasta ahora.

string pageSource = "";
            string geturl = @"C:\Documents and Settings\NASD_Download.mht";
            WebRequest getRequest = WebRequest.Create(geturl);
            WebResponse getResponse = getRequest.GetResponse();
            using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
            {
                pageSource = sr.ReadToEnd();
                pageSource.Replace("=", "");
            }
           var fileNames = from Match m in Regex.Matches(pageSource, @"[0-9]+_+[A-Za-z]+_+[0-9]+-+[0-9]+-+[0-9]+.+[a-z]")
                          select m.Value;
            foreach (var s in fileNames)
                Response.Write(s);

Debido a que aparece "=" en cada nombre de archivo no puedo obtener el nombre del archivo. ¿Cómo puedo eliminar la aparición de "=" en la pageSource string

Gracias por adelantado

Akhil

Respuesta aceptada

Bueno, sabiendo que las regex no son ideales para encontrar valores en HTML:

var files = [];
var p = document.getElementsByTagName('p');

for (var i = 0; i < p.length; i++){
    var match = p[i].innerHTML.match(/\s(\S+\.ext)\s/)

    if (match)
        files.push(match[1]);
}

Demo en vivo

Nota: Lea los comentarios a la pregunta.

Si la extensión puede ser cualquier cosa, puedes usar esto:

var files = [];
var p = document.getElementsByTagName('p');

for (var i = 0; i < p.length; i++){
    var match = p[i].innerHTML.match(/\b(\S+\.\S+)\b/)
    console.log(match)
    if (match)
        files.push(match[1]);
}
document.getElementById('result').innerHTML = files + "";

â € ‹Pero esto realmente no es confiable.

Demo en vivo


Respuesta popular

Puede ser imposible obtener nombres de archivos usando un patrón común debido a que 1.5in -.25in 7.0pt y me gusta, trate de ser más específico (si es posible), como
/[a-z0-9_-]+\.[az]+/gi o
/>[a-z0-9_-]+\.[az]+</gi (marcado incluido) o incluso
/>\d+_PostAccountingReport_\d+-\d+-\d+\.[az]+</gi



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué