Título: Problema con Expresiones regulares Publicado por: Lekim en 19 Diciembre 2015, 19:12 pm Hola
La verdad no comprendo como funcionan las expresiones regulares, pese a que hay ejemplos en la ayuda msdn. Estoy intentando obtener la Url de las imágenes de una página html junto con los valores Width, height y alt. El problema está en que no siempre está en el mismo orden. Es decir primero puede establecerse src después height, width y luego alt: <img src="..." height="128" width="128" alt"..."/> También: <img src="..." width"128" height="128" alt"..."/> O por el contrario, establecerse el width o el heigth antes que el src: <img width"128" height="128" src="..." alt"..."/> <img height"128" width="128" src="..." alt"..."/> Utilizando el sistema de las expresiones regulares con Regex ocurre que sólo obtiene los valores siempre y cuando estén el orden establecido en el pattern: Código
'¿Como puedo obtener los valores independientemente del orden en que se encuentren? Necesito encontrar los valores Width, height independientemente de si están antes que el src o después Gracias Título: Re: Problema con Expresiones regulares Publicado por: El Benjo en 19 Diciembre 2015, 19:39 pm Prueba primero obteniendo todas lás imágenes buscando únicamente la etiqueta "<img />" y por cada item devuelto realizas la busqueda de su height, después la búsqueda de su width, etc.
Título: Re: Problema con Expresiones regulares Publicado por: mOrfiUs0 en 19 Diciembre 2015, 20:49 pm Hola.
En ingeniería existe una máxima que a veces se olvida: Divide y Vencerás Prueba con bloques "<img(.*?)/>" y analiza con un regex más simple la casuística. Para hacer scraping hay varias librerías que simplifican el trabajo, como RestSharp Acabo de publicar un código que hace uso intensivo de regex, pero está en c#. Y te recomiendo que mires tutoriales antes de meterte de lleno. La web del guille en su día tenía ejemplos muy buenos. Regex es una herramienta muy potente, pero requiere de un aprendizaje previo, a mi modo de ver. Saludos!! Título: Re: Problema con Expresiones regulares Publicado por: Eleкtro en 20 Diciembre 2015, 04:01 am @Lekim
Se que esto te va a gustar tan poco como cuando te aconsejé que era absurdo e ineficiente utilizar los wrappers de Vb6 en Vb.Net (el código fuente habla por si solo), y se que no te gustan mis "tochos", no me cojas más manía... ;) pero ahí va: Utilizando el sistema de las expresiones regulares con Regex ocurre que sólo obtiene los valores siempre y cuando estén el orden establecido en el pattern:s En .Net, RegEx se debería utilizar solamente cómo último recurso, cuando no nos quedan ideas para llevar a cabo esa tarea, o para escribir algoritmos con más rapidez cuando nos es indiferente el rendimiento y solo queremos acabar de escribir el algoritmo, pero lo cierto es que siempre habrá otro recurso más óptimo que reemplace a RegEx si estamos desarrollando en .Net. A pesar de lo que he dicho, el motor RegEx de .Net es sofisticadísimo, ahora no recuerdo en que principios/fórmulas se basa (soy un inepto en matemáticas de todas formas), pero en ciertas circunstancias puede superar en velocidad a un simple String.Split. Dicho esto, algo muy importante a tener en cuenta es que los motores RegEx no se idearon ni diseñaron para parsear Html o lenguajes de markups en general; es un completo overkill hacer eso, con respecto al rendimiento y estabilidad de tu algoritmo en general. De todas formas, si, puedes hacerlo. Si desconoces el orden de los factores entonces no debes utilizar índices de grupos, debes construir los grupos tu mismo. Fíjate que el indexer de la class GroupCollection tiene un overload que acepta un nombre de grupo: (http://i.imgur.com/dLBRsou.png) ...Eso debería llevarte a la siguiente conclusión: se pueden agrupar las capturas por nombres de grupo. Para ello, esta es la sintaxis adecuada: Código: (?<NombreDeGrupo>|Expresión de búsqueda) donde (? es la apertura de grupo. Aquí tienes la solución, pero he eliminado el atributo height para que hagas tu el resto del trabajo :P: Código
Aquí tienes otro código de ejemplo:
EDITO: Y aquí más info sobre el tema (pero cuidado, la sintaxis RegEx es para perl):
¿Como puedo obtener los valores independientemente del orden en que se encuentren? Como te indiqué arriba es la manera de hacerlo mediante expresiones regulares, pero como también dije al principio, no se debe hacer, la razón es simple, aparte de que no es apto, no es lo recomendable por Microsoft, y RegEx es un mecanismo (muy) lento; aparte de todo eso también es completamente innecesario, ya que la maravillosa IDE de Microsoft tiene un interprete/parser en tiempo de diseño para lenguajes de markups, es practicamente lo mismo para Html y Xml. Una manera sería tan sencilla como obtener el string del documento que quieres parsear, convertirlo a otro formato más amistoso para la tarea (HtmlDocument o XDocument), obtener el elemento (mediante LINQ, o una expresión XPath, o el intérprete en tiempo de diseño), y leer el atributo del elemento. Pseudo-ejemplo: Código
Otro ejemplo: Código
PD: Además, siempre puedes optar por utilizar los métodos de esas classes si lo prefieres en lugar de parsear el documento en tiempo de diseño. Saludos Título: Re: Problema con Expresiones regulares Publicado por: Lekim en 25 Diciembre 2015, 19:23 pm Hola y felices fiestas para quien las celebre
Gracias a todos por las respuestas. He tardado en responder porque ahora estoy currando y no he tenido tiempo para mí y para programar. Tras probar varios sistemas me inclino por Regex. XDocument es para XML y HtmlDocument me obliga a usar WebBroser y parsear desde el evento DocumentCompleted y tarda un huevo :-\ También he probado con mshtml.IHTMLDocument2: Código
Pero no me devuelve el Width ni el Height. Siempre devuelve 0, no se porqué. Por otro lado HtmlDocument NO devuelve todos los img, no sé por qué con algunas páginas no muestra todos los enlaces src siempre se deja algunos, cosa que no ocurre usando regex Sldos Título: Re: Problema con Expresiones regulares Publicado por: Eleкtro en 25 Diciembre 2015, 20:39 pm XDocument es para XML Intenta evitar el uso de mshtml por dos motivos, primero por que es innecesario para esta tarea existiendo los miembros mencionados con los que puedes hacerlo, y segundo por que está ausente de documentación oficial en su mayor parte, lo que te podría resultar una pesdailla ya que estarías condenado a un búcle trial-and-error sin salida... Si quieres publica aquí o pásame por privado el código fuente de la página y te muestro como hacerlo. HtmlDocument me obliga a usar WebBroser y parsear desde el evento DocumentCompleted y tarda un huevo :-\ En realidad no. Es cierto que un HtmlDocument no se puede instanciar así como así, está limitado en ese sentido ya que debes usar un WebBrowser, pero simplemente lo usarías para cargar el document y listo, no tarda. Código sacado de mi API, ElektroKit:
Código
Saludos y feliz navidad a ti también. Título: Re: Problema con Expresiones regulares Publicado por: Lekim en 24 Enero 2016, 10:02 am Hola
Por fin me he podido poner a programar ;-) Perdona que sea tan cabezón, pero de verdad, no me gusta WebBrowser. Y como comenté, según que páginas no me devuelve todas los enlaces. No se porqué. Finalmente esto es lo que usaré utilizando el sistema que me habéis comentado: Código
Sl2s y se agradece la ayuda. |