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标签,您应该在列表理解中更深入一层以获取标签命名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 回答