0
get_currency() ->       
URL = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22GBPEUR%22)&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys",
{Result, Info} = httpc:request(URL),
case Result of
    error -> 
        {Result, Info};
    ok ->
        {{_Protocol, Code, _CodeStr}, _Attrs, WebData} = Info,
        WebData
    end.

extract_text(Content) ->
Item = hd(Content),
case element(1, Item) of
    xmlText -> Item#xmlText.value;
    _ -> ""
end.



analyze_info(WebData) ->        
ToFind = [rate],
Parsed = element(1, xmerl_scan:string(WebData)),
Children = Parsed#xmlElement.content,
ElementList = [{El#xmlElement.name, extract_text(El#xmlElement.content)} || El <- Children, element(1, El) == xmlElement],
lists:map(fun(Item) -> lists:keyfind(Item, 1, ElementList) end, ToFind).

上記は、URL http://query.yahooapis.com/v1/public/yql?q=select%20 *%20from%20yahoo.finance.xchange%からタグの内容を抽出するために使用するコードです。20where%20pair%20in%20(%22GBPEUR%22)&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys.

これが私がシェルで行うことです。

inets:start().
XML = scrapetest:get_currency().
scrapetest:analyze_info(XML).

そして、私が得るリターンは単に「偽」です。何が間違っているのかわかりません。

4

1 に答える 1

0

コードにいくつかのログを追加するだけです。

例えば。追加io:format("~p~n", [ElementList]),- ElementList にresultタグのみが含まれていることを示します。リスト内包表記を 1 レベル深く調べて、タグの名前を取得する必要があります。rate

これは一般的なアドバイスです。

あなたの場合、より良い決定は再帰的検索機能であるようです(コードを書きたい場合)

または xmerl_xpath のようないくつかのバッテリーを使用します

別の例analyze_info

analyze_info(WebData) -> 
  Parsed = element(1, xmerl_scan:string(WebData)),
  xmerl_xpath:string("//Rate/text()", Parsed).

これは以下を返します:

[{xmlText,[{'Rate',2},{rate,1},{results,1},{query,1}],
      1,[],"1.1813",text}]
于 2013-10-20T13:51:24.030 に答える