从XML中使用XPath提取URL

时间:2012-10-02 08:27:07

标签: erlang

我正在尝试提取描述标记下的第二个链接。我写了下面的代码,但它看起来非常混乱的freads和子串(只是为了让它工作)。有没有更清洁的方法来实现这一目标?

XML Extract

  

魔法(URL) - >

     

Tag =“。xml”,

     

inets:开始(),

     

{ok,{Status,Headers,Body}} = httpc:request(Url ++ Tag),

     

{Xml,Rest} = xmerl_scan:string(Body),

     

{xmlObj,string,A} = xmerl_xpath:string(“substring-after(substring-after(substring-> before(// channel / item / description [1],'\”> [link]'),'br'),'href =')“,Xml),

     

{ok,_,B} = io_lib:fread(“~6s”,A),

     

的字符串:SUB_STRING(B,1,字符串:LEN(B)-1)

1 个答案:

答案 0 :(得分:2)

不是一个完美的解决方案,但您可以使用这样的xpath //channel/item/description[1]/text()[16]//channel/item/description[1]/text()[24]

提取的字符串在开头包含网址+引号,因此您可以使用列表匹配语法来剪切引号:[_|Url] = ...

所以使用这个:[{_,_,_,_,[_|U1],_}] = xmerl_xpath:string("//channel/item/description[1]/text()[16]", Xml).将U1与第一个URL绑定。

在shell中测试:

11> [{_,_,_,_,[_|U1],_}] = xmerl_xpath:string("//channel/item/description[1]/text()[16]", Xml). 
[{xmlText,[{description,5},{item,5},{channel,1},{rss,1}],
          16,[],"\"http://www.reddit.com/user/escaped_reddit",text}]
12> 
12> U1.
"http://www.reddit.com/user/escaped_reddit"
13> 
13> 
13> [{_,_,_,_,[_|U2],_}] = xmerl_xpath:string("//channel/item/description[1]/text()[24]", Xml). 
[{xmlText,[{description,5},{item,5},{channel,1},{rss,1}],
          24,[],
          "\"http://www.reddit.com/r/erlang/comments/y62wf/how_to_use_ranch/",
          text}]
14> 
14> U2.
"http://www.reddit.com/r/erlang/comments/y62wf/how_to_use_ranch/"