2014-03-02 1 views
1

프로젝트 작업 중이고 urlGet에 대한 경험이 거의 없으므로 예제를 통해이 작업을 직접 수행 할 수있는 훌륭한 참고 자료를 찾지 못했습니다. 따라서 커뮤니티에서 도움이 될 수 있기를 바랍니다. LUA에 대한 이해 urlGet 및 RegEx

은 내가 특별히, 웹 페이지에서 일부 데이터를 추출하려고 시도하고있다 :이 페이지

https://rrtp.comed.com/rrtp/ServletFeed?type=instanthourly

은 거주 실시간 가격라는 프로그램에 우리의 사람들을 위해 전기에 대한 실시간 가격 데이터입니다. 이 페이지에서 가정용 자동화 시스템과 함께 사용하기 위해 수치적인 비용 데이터를 가져 오려고합니다.

필자는 야후 날씨 API를 통해 데이터를 가져 오는 예제로서 직설적 인 번역이 아닌 내 작업의 기본 예제와 비슷한 다른 드라이버를 사용하고 있습니다. 그러나 일반 교장은 내가 이해하는 것과 동일해야합니다.

function Init() 
    -- Create Variables 
    for k, v in pairs(weatherData) do 
     if (not Variables[k]) then 
      C4:AddVariable(k, v, "NUMBER", true, false) 
     end 
    end 
end 

function RequestData() 
    local query = "select%20wind%2C%20atmosphere%2C%20item.title%2C%20item.condition.code%2C%20item.condition.temp%20from%20weather.forecast%20where%20woeid%3D" .. Properties[WOEID] .. "%20and%20u%3D%22" .. Properties[UNIT] .. "%22" 
    C4:urlGet(string.format("http://query.yahooapis.com/v1/public/yql?q=%s", query)) 
end 

function ReceivedAsync(ticketId, strData, responseCode, tHeaders) 
    dbg(string.format("ReceivedAsync[%s]: %s", ticketId, strData)) 

    for k, v in pairs(weatherData) do 
     local tempVal = ParseData(strData, k) 

     -- Set property, table, and variable 
     Properties[displayProperties[k]] = tempVal 
     weatherData[k] = tempVal 
     C4:SetVariable(k, tostring(tempVal)) 

     OnPropertyChanged(displayProperties[k]) 

     if (tempVal ~= weatherData[k]) then 
      if (k == RISING) then 
       tempVal = weatherRising[tonumber(tempVal)] or "N/A" 
      end 
     end 

     C4:UpdateProperty(displayProperties[k], tostring(tempVal)) 
    end 

    if(weatherData["code"] ~= "N/A" and weatherData["code"] ~= nil) then 
     weatherData["condition"] = weatherConditions[tonumber(weatherData["code"])] 
     C4:UpdateProperty(CONDITION, weatherData["condition"]) 
    end 

    for k, v in pairs(weatherData) do 
     dbg(displayProperties[k] .. ":" .. v) 
    end 
end 

function ParseData(strData, item) 
    return string.match(strData, string.format("%s=\"(.-)\"", item)) or 
    string.match(strData, string.format("<%s>Conditions for (.+)</%s>", item, item)) or 
    "N/A" 
end 

SO ... 내가 답을 알고 있다고 생각

내 첫 번째 질문,있다 : 여기서 특히 RequestData 기능을보고 예제 코드에서 관련 SNIPPIT 및 ParseData 섹션입니다 url을 사용할 때 어떻게 웹 페이지를 볼 수 있습니까? 그것은 원시 HTML 또는 모든 HTML 마크 업없이 볼 수 있습니다.

숫자 데이터를 가져 오기 위해 빌드해야하는 정규 표현식을 변경한다고 생각하기 때문에이 질문을드립니다.

여기에 제안하는 urlGet 및 string.match가 있습니다. 내가 올바른 방향으로 향하고 있는지, 아니면 다른 어떤 입력으로 향하고 있는지 알면 어떤 통찰력이라도 고맙겠습니다.

function RequestData() 
    C4:urlGet(string.format("https://rrtp.comed.com/rrtp/ServletFeed type=instanthourly)) 
end 

.

function ParseData(strData, item) 
    return string.match(strData, string.format("\b([0-9]\.[0-9])\b")) or 
    "N/A" 
end 

답변

0

가격을 추출하려면이 패턴을 시도하십시오 : "(%d+%.%d+)". 루아 패턴의 이스케이프는 %입니다.