Título: Normalizar un enlace de búsqueda de google Publicado por: Lekim en 23 Enero 2016, 01:05 am Hola
No consigo obtener el enlace a los que redirecciona google por ejemplo: Código: https://www.google.es/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiK3Ii9zr7KAhXD0RQKHekoC9kQFggcMAA&url=http%3A%2F%2Fwww.recursosvisualbasic.com.ar%2Fhtm%2Fvb-net%2F54-obtener-links-de-una-pagina-web.htm&usg=AFQjCNGMpwVIQ7z-vWEq6Urag9Vf_UAKGg&bvm=bv.112454388,d.d24 Redirecciona a...: Código: http://www.recursosvisualbasic.com.ar/htm/vb-net/54-obtener-links-de-una-pagina-web.htm Yo utilizo el siguiente código para obtener el enlace al que redirecciona una determianda URL Código
Este código se usa del modo siguiente: Código
Sin embargo no me funciona con los enlaces que ofrece Google en el listado de búsqueda. S2s Una forma que he ideado es esta: Código
Pero mi intención es que conseguir un método general que sirva para cualquier URL sin afectar a URLs que no redireccionen. De otro modo tengo que hacer que el programa determine si es redireccionable y si lo es, si éste es de Google para aplicar el código que acabo de mostrar... Esto no me convence. Bueno, lo he resuelto de la siguiente manera. Que como dije obtiene la URL a la que redirecciona de forma selectiva. Si es de Google aplica un método y si no lo es aplica el otro. Código
Sirve para evitar errores al usar System.Net.HttpWebRequest o System.Net.WebClient con URLs que redireccionan. NOTA: He hecho algunas correcciones y modificaciones respecto al código que expuse ayer. Disculpen las molestias He añadido por ejemplo esta función: Código
Ya que yo creía que sólo había que sustituir "%3A" por ":" y "%2F" por "/". Entonces he visto otro enlace con "%3F" y comprendí que se trata de número de un carácter convertido a hexadecimal. Es decir 3A = 58 que equivale a ":" y 2F = 47 que equivale a "/". He hecho esa función para sustituir cualquier código hexadecimal por su carácter correspondiente. Por otro lado la función ResolverUrlGoogle tampoco estaba bien del todo . No todos los enlaces, pasados por split se encuentran el la posición 10 del array. Así que hago que busque la url dentro del array. De todos modos aún no está perfecto porque hay enlaces, aunque poco comunes, que se devuelven incompletos o con algún carácter demás. Sl2s Título: Re: Normalizar un enlace de búsqueda de google Publicado por: Eleкtro en 24 Enero 2016, 14:39 pm yo creía que sólo había que sustituir "%3A" por ":" y "%2F" por "/". Entonces he visto otro enlace con "%3F" y comprendí que se trata de número de un carácter convertido a hexadecimal. Es decir 3A = 58 que equivale a ":" y 2F = 47 que equivale a "/". Son las entidades Html:
He hecho esa función para sustituir cualquier código hexadecimal por su carácter correspondiente. En realidad la función que hiciste es innecesaria, por que ya está hecha. Es el momento para que le eches un vistazo a la class HttpUtility:
Ejemplo: Código
la función ResolverUrlGoogle tampoco estaba bien del todo. No todos los enlaces, pasados por split se encuentran el la posición 10 del array. Si no he entendido mal, tu propósito real no es redireccionar la url, sino intentar obtener el valor del parámetro "url" de la query de Google, y entonces no necesitas hacer más que recurrir de nuevo a la class HttpUtility. Ejemplo: Código
Como consejo, intenta tener siempre presente que la librería de classes de .Net Framework es la más extensa y gigantesca que existe en el ámbito de los lenguajes de programación, y debido a eso en la mayoría de ocasiones es bastante posible hallar algún método (o type) built-in optimizado para evitarte desarrollar algoritmos propios, e imperfectos (en general). Aunque estés casi convencido de que probablemente no existirá nada al respecto (como por ejemplo la función de decodificación de entidades html), deberías buscar o preguntar al respecto, por el "nunca se sabe". Si no estás seguro de cual podría ser la mejor forma de llevar a cabo una tarea entonces, antes de ponerte a hacer ningún algoritmo, podrías preguntar en el foro para que te orientemos sobre las posibles opciones... A todos nos ha pasado algo similar, me refiero a desarrollar "un centenar" de lineas de código y descubrir que se puede reducir a un par de lineas (no solo reducir en este caso, sino mejorar), es algo que puede doler un poco por el esfuerzo invertido en nuestro propio algoritmo pero acabar descartando y sustituyendo ese algoritmo, en tu caso, es lo correcto para obtener la eficiencia del uso de los métodos integrados en la librería de clases de .Net Framework, y es algo positivo también en el sentido de que cosas como esta son la base del aprendizaje hacia el dominio de técnicas de refactorización de código (habilidad muy importante y util en un programador), y aparte, es algo normal que sucedan estas cosas... ya que es imposible conocer al 100% todos los miembros de .Net Framework y sus diversas utilidades. Por último me gustaría añadir que para redireccionar urls yo utilizo la siguiente metodología (tal vez no funcionará con todas las urls, pero quizás te sirva en otras circunstancias ya que es una solución de uso genérico como lo que estás intentando): Aunque es un código muy simple y sin misterio, debo mencionar que lo he sacado de mi API ElektroKit: (http://i.imgur.com/zV6aHlg.png) (https://github.com/ElektroStudios/ElektroKit/blob/master/Solution/v1.1/Elektro.Net/Tools/NetworkUtil.vb) Código
Ejemplo de uso: Código
Saludos! Título: Re: Normalizar un enlace de búsqueda de google Publicado por: Lekim en 25 Enero 2016, 07:58 am Hola
Cuando vi tu respuesta y nombraste la clase HttpUtility, fue una alegría, por fin lo que buscaba. Incluso te envié un mensaje de agradecimiento para no añadir más comentarios a este tema. Pero mi alegría se convirtió en decepción al comprobar que dicha clase (HttpUtility) ne se encuentra dentro de System.Web, es más, en el enlace que facilitas HttpUtility Clase (https://msdn.microsoft.com/en-us/library/system.web.httputility%28v=vs.100%29.aspx), abajo, en los comentarios, puede verse que un usuario tiene el mismo problema, del cual creo no aparece la solución. Se supone que forma parte de .NET Framework 4 pero desde luego al parecer en el mío no está. Sl2s Título: Re: Normalizar un enlace de búsqueda de google Publicado por: Eleкtro en 25 Enero 2016, 10:35 am Hola Cuando vi tu respuesta y nombraste la clase HttpUtility, fue una alegría, por fin lo que buscaba. Incluso te envié un mensaje de agradecimiento para no añadir más comentarios a este tema. Pero mi alegría se convirtió en decepción al comprobar que dicha clase (HttpUtility) ne se encuentra dentro de System.Web, es más, en el enlace que facilitas HttpUtility Clase (https://msdn.microsoft.com/en-us/library/system.web.httputility%28v=vs.100%29.aspx), abajo, en los comentarios, puede verse que un usuario tiene el mismo problema, del cual creo no aparece la solución. Se supone que forma parte de .NET Framework 4 pero desde luego al parecer en el mío no está. ( No me ha llegado ningún "mensaje" por tu parte ) Si lees detenidamente los comentarios verás que la solución si que se menciona, aunque de forma indirecta. Lo que se menciona al problema que indicas es que la class no está disponible en el perfil de cliente de .Net Framework 4.0 ( algo relativamente comprensible ya que es una distribuición del paquete limitado/reducido de .Net framework ), el cual es indudablemente el framework objetivo con el que estás intentando trabajar en VS y por ese motivo no encuentras el miembro. Para solucionarlo, simplemente debes instalar el perfil completo de .Net Framework 4.0, en general debes instalar siempre el perfil completo para el .Net Framework que sea con el que tengas pensado desarrollar...
Otra solución sería que instalases .Net Framework 4.5, ya que al instalar esta versión de .Net Framework, el perfil cliente de 4.0 que tienes instalado se actualizaría automaticamente al perfil completo, o al menos eso indica Microsoft:
PD: Para evitarte futuras confusiones, nótese que a partir de .Net Framework 4.5 ya no se distribuyen perfiles de cliente. Saludos Título: Re: Normalizar un enlace de búsqueda de google Publicado por: Lekim en 12 Marzo 2016, 17:24 pm Hola
Me veo obligado a reabrir este tema ya que puede haber gente que no encuentre la clase System.Web.httpUtility, que mencionó Elektro. Tras instalar : Microsoft .NET Framework 4 Client Profile Microsoft .NET Framework 4 Full Profile Siguía sin poder importar dicha clase. Ni siquiera la encuentro en el cuadro Agregar Referencias que puedes encontrar en el menú Proyecto. Tampoco seleccionar, si tienes disponible en referencias System.Web. Pues bien, la clase System.Web.httpUtility se encuentra en un archivo llamado System.Web.dll. Sin embargo, NO está disponible en todas las versiones de dicho archivo. System.Web.dll 2.0.50727.312 System.Web.httpUtility NO DISPONIBLE System.Web.dll 4.6.81.0 System.Web.httpUtility NO DISPONIBLE System.Web.dll 4.0.30319.1 System.Web.httpUtility NO DISPONIBLE System.Web.dll 2.0.50727.4016 System.Web.httpUtility DISPONIBLE System.Web.dll 2.0.50727.4205 System.Web.httpUtility DISPONIBLE Que no, que no hay error. Has visto bien, 2.0.50727.4016 y no en versiones más recientes como 4.0 o 4.6. ¿Porqué? Ni pajotera y idea :xD. Puede que esté disponible en versiones 64bits, yo que se... Puedes buscar mediante el sistema de búsqueda de windows (Tecla windows + F) y buscar los distintos archivos System.Web.dll en el disco. Luego en el entorno de VB.NET abrir el cuadro 'Agregar Referencia' y pestaña 'Examinar' agregar el archivo System.Web.dll. Ahora si la versión de System.Web.dll es la que buscamos, al teclear Imports System.web._ aparecerá una lista amplia de opciones, incluída System.Web.httpUtility Espero a alguien le sirva ;) S2s Título: Re: Normalizar un enlace de búsqueda de google Publicado por: Eleкtro en 12 Marzo 2016, 18:48 pm Hola
Lo primero de todo que quiero explicar (para quien no lo sepa) es que la versión del archivo hace referencia a la versión de .Net Framework, versión 2.0 = .Net Framework 2.0, versión 4.0 = .Net Framework 4.0 (el resto es el número de la build) Bien, sabiendo esto, simplemente usa la lógica de la siguiente manera: Si la class se encuentra en la versión 2.0 de .Net Framework, la misma class se debe encontrar en la versión 4.0, no hace falta comprobarlo, pero lo puedes comprobar con aplicaciones como .Net Reflector, Simple Assembly Explorer, o ILSpy (o simplemente observaando la información del ensamblado en la documentación online de la MSDN.), te aseguro que se encuentran en ambas versiones y de ambas arquitecturas (y si, lo he comprobado aunque no hiciera falta, por que no me gusta hablar sin verificar al 100%. ) (http://i.imgur.com/auZMWXw.png) (http://i.imgur.com/wx1NpKK.png) ( El número de ensamblado ignorarlo, puesto que no es lo mismo que el número de archivo, pero como ya te digo lo he comprobado con los números de archivo 2.0.x y 4.0.x del perfil completo ) Que no, que no hay error. Has visto bien Los datos que has proporcionado se debe a que, o bien lo has comprobado erroneamente (has comprobado los archivos de la instalación compacta), o tienes algún tipo de conflicto con la instalación del .Net Framework compacto y la instalación completa, puesto que si no encuentras la class HttpUtility es por que estás analizando el ensamblado de la instalación compacta (el perfil cliente), mi consejo: Haz una instalación limpia del perfil completo de .Net Framework 4.0 (o deja de usar Windows XP, es otra solución :P). Para que te sirva de ayuda y puedas verificar si tienes los archivos correctos en tu PC, aquí te dejo mis archivos con un par de hashes para que compares (aunque quizás no te sirva, ya que los números de build que has mencionado no se corresponden a estos del perfil completo): System.Web.dll v2.0.50727.7905 x86 | MD5: 1828cc36f4c32e6e9107442c18bab4d4 | SHA1: 58efd875768818e525fa8a2b8110d9231cb30848 System.Web.dll v2.0.50727.7905 x64 | MD5: 02ae2cc1b00dae66b08f1a1ae22f3407 | SHA1: 8afdbc8a26063a50cf963034e67f5436871c19c1 System.Web.dll v4.0.30319.33440 x86 | MD5: ddece90e17b888567f129af5072e5a7d | SHA1: 69a771623fe030c032b1a24fee313c8b54967190 System.Web.dll v4.0.30319.33440 x64 | MD5: 434536963bed0da0c8e722252014a2d6 | SHA1: 973c796405f02590a786c0f1b6173112e73bcdf2 Puedes probar a activar la columna "Nombre Producto" en el explorador de Windows, quizás te diga si tus archivos se tratan de la versión compacta o no (no estoy seguro de la descripción que dará si se trata de compacta, solo es una sugerencia para que pruebes a ver si te dice algo de utilidad) Saludos! Título: Re: Normalizar un enlace de búsqueda de google Publicado por: Lekim en 12 Marzo 2016, 20:00 pm Hola Elektro
Antes de nada comentarte que dicha comprobación no la he hecho desde XP si no desde Vista. Uso también W7 64bits pero debido a un problema lo desinstalé y lo tengo que volver a instalar. Y segundo la comprobación de la versión del archivo System.Web.dll, es la que me proporciona el propio archivo. Ya sabes.. Clic botón derecho, Propiedades, Detalles...y ahí muestra la versión. La otra fuente es del propio VB.NET. En el cuadro 'Agregar Referencia' y pestaña 'Reciente' pueden verse un lista de los componentes agregados recientemente. Las versiones que he puesto esas mismas, que coinciden con la de 'Propiedades' del propio archivo. Por cierto, no se que pasa que parece que mis mensajes no te llegan, porque te envié un mensaje explicando el asunto y mostrando los directorios donde encontré los archivos: Código: Finalmente conseguí importar system.web.HttpUtility Puede verse que ni en V4.0 ni en 4.6 System.Web.dll contiene dichas clases. Por lo menos en mi sistema. Independientemente del ensamblado y la versión si el archivo está en ...Microsoft\Framework\.NETFramework\v4.0 es que es del paquete de Framework4 y si está en C:\Windows\Microsoft.NET\Framework\v4.0.30319, igual, etc. Digo yo. Y dichos archivos los he cargado desde el cuadro de 'Agregar Referencia' (de ahí el historial de recientes con su número de versión) y no me carga las clases. Si hay un conflicto ahí, ya no se. En el directorio C:\Windows\Microsoft.NET\Framework , se encuentran los siguientes carpetas: 3082 v1.0.3705 v1.1.4322 v2.0.50727 v3.0 v3.5 v4.0.30319 v2.0.50727 contiene un archivo System.Web.dll el cual SI me carga la clase System.web.HttpUtility Código: Length Of Struc: 03BCh v4.0.30319 Contiene un archivo System.Web.dll que NO me carga la clase Sytem.Web.HttpUtility Código: Length Of Struc: 03CCh Voy a desinstalar y volver a instalar el Framework a ver que pasa Quizás system.web.dll sea distinto según la versión de windows, no se. S2s FRAMEWORK PARA VB.NET (http://getdotnet.azurewebsites.net/target-dotnet-platforms.html#) Título: Re: Normalizar un enlace de búsqueda de google Publicado por: Lekim en 12 Marzo 2016, 22:39 pm ...Ahora si que tengo conflicto.
Porque después de desinstalar el FramWork y volverlo a instalar, ahora VB.Net me dice que debo seleccionar un Framework, y en la activación decomponentes de windows no aparece el 4, solo el 3 y además se queda conjelado cuando lo activa... Con la rabia que me da tener que esperar, y las barras de progreso, puff Muchas gracias... ;-) Bueno, finalmente tuve que reinstalar VB.NET. Y tras instalar el Framework 4.5, seguía sin aparecer la clase System.Web.HttpUtility. Pero.... utilizando el Desensamblador de NET, veo que en todas las versiones de System.Web.dll se encuentra dicha clase. Que no quiere decir que luego esté disponible la clase System.Web.HttpUtility. (https://1.bp.blogspot.com/-VKhKwqcSmw0/VuTKbSs2HaI/AAAAAAAAAVo/YC-EEh2u6ew1RKBpOzPYPgguMODwyqKSw/s1600/System.web.dll.jpg) (en este imagen puede verse system.web.httpUtility pero la clase no se me carga en Net cuando importo esta versión de System.Web.dll en el Framework 4.x) Sin embargo VB.NET, no carga la clase con todas las versiones System.Web.dll, no se porqué. Quizás dependa de la versión que se use de .NET y el Framework compatible con esa versión. El tema es interesante y curioso, pero ya es un poco cansino como para ir instalado versiones de Windows, NET y Framework, que no se hace en 5 minutos precisamente. Es lo malo de windows, con tantos cambios, versiones, etc, pasan estas cosas. El caso es y ya he explicado arriba. Que si no lo tienes disponible la clase que quieres usar puedes probar en buscar otra versión de System.Web.dll e importarlo desde le cuadro Agregar referencias. Si es q te vale la pena. S2s Título: Re: Normalizar un enlace de búsqueda de google Publicado por: Eleкtro en 21 Marzo 2016, 13:38 pm Bueno, tu has desarrollado la función alternativa para decodificar, y yo simplemente quiero compartir una función alternativa para codificar...
La diferencia entre esta función y la de Microsoft, es que el código de por ciento se escribe en mayúscula (un capricho que tengo, por que prefiero los valores hexadecimales en mayúscula). Aquí tienen: Código
Nota: La función HttpUtility.UrlDecode() toma perfectamente los valores hexadecimales en mayúscula. Saludos! |