2012-04-24 14 views
5

Hasta ahora, tengo el siguiente fragmento:página Obtención de URL usando luasocket y el proxy

local socket = require "socket.http" 
client,r,c,h = socket.request{url = "http://example.com/", proxy="<my proxy and port here>"} 
for i,v in pairs(c) do 
    print(i, v) 
end 

que me da una salida como la siguiente:

connection close 
content-type text/html; charset=UTF-8 
location http://www.iana.org/domains/example/ 
vary Accept-Encoding 
date Tue, 24 Apr 2012 21:43:19 GMT 
last-modified Wed, 09 Feb 2011 17:13:15 GMT 
transfer-encoding chunked 
server Apache/2.2.3 (CentOS) 

lo que significa que la conexión establecida justo perfectamente. Ahora, quiero buscar el título de mi url's usando este socket.http. Busqué preguntas anteriores de SO y el luasocket's http documentation. pero, todavía no tengo idea de cómo buscar/almacenar la totalidad/parte de la página en una variable y hacer algo con ella.

Por favor ayuda.

Respuesta

4

Está utilizando la forma 'genérica' de http.request(), que requiere almacenar el cuerpo a través de un receptor LTN12. No es tan complicado como suena, prueba este código:

local socket = require "socket.http" 
local ltn12 = require "ltn12"; -- LTN12 lib provided by LuaSocket 

-- This table will store the body (possibly in multiple chunks): 
local result_table = {}; 
client,r,c,h = socket.request{ 
    url = "http://example.com/", 
    sink = ltn12.sink.table(result_table), 
    proxy="<my proxy and port here>" 
} 
-- Join the chunks together into a string: 
local result = table.concat(result_table); 
-- Hacky solution to extract the title: 
local title = result:match("<[Tt][Ii][Tt][Ll][Ee]>([^<]*)<"); 
print(title); 

Si su proxy es constante a lo largo de su aplicación, entonces una solución más sencilla sería utilizar la forma simple de http.request(), y especificar el proxy a través de http.PROXY:

local http = require "socket.http" 
http.PROXY="<my proxy and port here>" 

local result = http.request("http://www.youtube.com/watch?v=_eT40eV7OiI") 
local title = result:match("<[Tt][Ii][Tt][Ll][Ee]>([^<]*)<"); 
print(title); 

salida:

Flanders and Swann - A song of the weather 
    - YouTube 
+0

Gracias! Esto funciona muy bien en general con todo tipo de páginas. :) Pero, al tratar de buscar el título de los enlaces de youtube, la variable 'result' solo tiene la página [** 404 error **] (http://www.hastebin.com/gikavorone.xml). Intenté ambos métodos. El segundo trae las páginas más rápido. :) – hjpotter92

+0

Acabo de actualizar con un ejemplo de enlace de YouTube y la salida que obtengo. Todo funciona bien para mí. El título tiene relleno de espacio en blanco, y probablemente también entidades HTML. Probablemente querrás normalizarlo un poco desforrándolo y convirtiéndolo. – MattJ

+0

No, no funcionó todavía. Estoy ejecutando el archivo (llamado '02.lua') en SciTe. Aquí está la captura de pantalla de la salida y el código (utilicé 4 páginas web diferentes, 2 en mi propio servidor web). Compruebe: http://i.stack.imgur.com/XkQQj.jpg – hjpotter92

Cuestiones relacionadas