2012-04-24 9 views
5

Finora, ho il seguente pezzo:pagina Recupero di URL utilizzando luasocket e delega

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 

che mi dà un output simile al seguente:

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) 

il che significa che la connessione stabilita solo perfettamente. Ora, voglio recuperare il titolo del mio url's usando questo socket.http. Ho cercato le domande SO precedenti e lo luasocket's http documentation. ma, non ho ancora idea su come recuperare/memorizzare l'intera/parte della pagina in una variabile e fare qualcosa con esso.

Per favore aiuto.

risposta

4

Si sta utilizzando la forma "generica" ​​di http.request(), che richiede la memorizzazione del corpo tramite un sink LTN12. Non è così complicato come sembra, provate questo codice:

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); 

Se il proxy è costante in tutta l'applicazione, allora una soluzione più semplice sarebbe quella di utilizzare la semplice forma di http.request(), e specificare il proxy via 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); 

uscita:

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

Grazie! Funziona alla grande in generale con tutti i tipi di pagine. :) Ma, cercando di recuperare il titolo dei link di youtube, la variabile 'result' ha solo la pagina [** 404 error **] (http://www.hastebin.com/gikavorone.xml). Ho provato entrambi i metodi. Il secondo recupera le pagine più velocemente. :) – hjpotter92

+0

Ho appena aggiornato con un link YouTube di esempio e l'output che ottengo. Funziona tutto bene per me. Il titolo ha spazi vuoti che si riempiono e, a volte, anche entità HTML. Probabilmente vorrai normalizzarlo un po 'spogliandolo e convertendolo. – MattJ

+0

No, non ha funzionato ancora. Sto facendo funzionare il file (chiamato '02.lua') in SciTe. Ecco lo screenshot dell'output e del codice (ho usato 4 diverse pagine web, 2 sul mio web-server). Controllare: http://i.stack.imgur.com/XkQQj.jpg – hjpotter92