0 0

在Erlang中,如何从一个网页抓取网页链接及它的2级链接?20

『问』在Erlang中,从一个网页抓取网页链接及它的2级链接?
-module(spider).
-compile(export_all).
-import(lists,[reverse/1,reverse/2,map/2]).

nano_get_url() ->
nano_get_url("www.erlang.org").

nano_get_url(Host) ->
{ok,Socket} = gen_tcp:connect(Host, 80, [binary,{packet,0}]),
ok = gen_tcp:send(Socket,"GET / HTTP/1.0\r\n\r\n"),
receive_data(Socket,[]).

receive_data(Socket,SoFar) ->
receive
{tcp,Socket,Bin} ->
receive_data(Socket,[Bin|SoFar]);
{tcp_closed,Socket} -> 
list_to_binary(lists:reverse(SoFar))
end.

urls2htmlFile(Urls,File) ->
  file:write_file(File,urls2html(Urls)).

bin2urls(Bin) -> gather_urls(binary_to_list(Bin),[]).

urls2html(Urls) -> [h1("Urls"),make_list(Urls)].


h1(Title) -> ["<h1>",Title,"</h1>\n"].

make_list(L) ->
["<u1>\n",
  map(fun(I) -> ["<li>",I,"</li>\n"] end, L),
  "</u1>\n"].

gather_urls("<a href" ++ T,L) ->
  {Url,T1}=collect_url_body(T,reverse("<a href")),
  gather_urls(T1,[Url|L]);
gather_urls([_|T],L) -> 
  gather_urls(T,L);
gather_urls([],L) -> 
  L.

collect_url_body("</a>" ++ T,L) -> {reverse(L,"</a>"),T};
collect_url_body([H|T],L) -> collect_url_body(T,[H|L]);
collect_url_body([],_) -> {[],[]}.



它的结果为:
<h1>Urls</h1> 
<u1> 
<li><a href="http://www.openssl.org/">openSSL</a></li> 
<li><a href="http://www.modssl.org/">mod_ssl</a></li> 
<li><a href="http://www.openbsd.org/art1.html">OpenBSD images</a></li> 
<li><a href="http://www.openbsd.org/">OpenBSD</a></li> 
<li><a href="http://www.openbsd.org/cgi-bin/man.cgi?query=httpd&format=html">httpd(8)</a></li> 
<li><a href="http://www.openbsd.org/cgi-bin/man.cgi?query=ssl&format=html&sektion=8">ssl(8)</a></li> 
<li><a href="http://www.openbsd.org/faq/faq4.html#FilesNeeded">misc</a></li> 
<li><a href="http://www.openbsd.org/"> 
  OpenBSD System</a></li> 
<li><a href="http://httpd.apache.org/">Apache Web server</a></li> 
<li><a href="http://www.openbsd.org/"><img alt="[OpenBSD]" border="0" height=30 width=141 SRC="smalltitle.gif"></a></li> 
</u1> 
这是个一级链接,求二级链接!


我是想把以及链接的 <a href 后面的url地址提取出来,用file:read_file(“http://www.openssl.org/")这样的URl地址提取出来,求详解!谢谢!
(本人初学者)

问题补充:
shenhui134 写道
正则匹配下


Erlang中没有正则
2011年3月17日 10:40

1个答案 按时间排序 按投票排序

0 0

正则匹配下

2011年3月17日 12:14

相关推荐

    erlang中文基础教程

    Erlang 编程语言是一种功能强大且灵活的编程语言,它提供了一个交互式的 shell 环境,允许用户在其中编写和运行代码。 Erlang Shell 是一个命令行交互环境,类似于 UNIX 和 LINUX 系统的命令行模式。 1. Erlang ...

    在erlang项目中使用protobuf例子

    描述中的“配套文章地址http://blog.csdn.net/mycwq/article/details/21864191”提供了一个链接,指向一个CSDN博客文章,该文章详细解释了如何在Erlang项目中实施protobuf。由于无法直接访问这个链接,我将基于...

    erlang编程 Introducing Erlang

    Erlang中的链接(Linking)和监控(Monitoring)机制允许进程间建立关系,以便在另一进程崩溃时得到通知。链接用于追踪相关进程的状态,而监控则可以观察进程的生存状态。 ### 5. 消息传递 Erlang的进程间通信主要...

    Erlang并发编程,Erlang程序设计,Erlang中文手册

     Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此非常适 合于构建分布式,实时软并行计算系统。 使用Erlang编写出的应用运行时...

    erlang高级原理和应用PPT

    描述中提到的“博文链接:https://mryufeng.iteye.com/blog/452275”虽然没有提供具体细节,但它指示了一个可能的来源,即一篇关于Erlang的博客文章。这个链接可以作为扩展学习和深入理解Erlang高级原理和应用的入口...

    erlang中dns解析

    它基于TCP和UDP协议,并提供了一个行为模式,使得开发者可以轻松地在自己的应用程序中集成DNS解析功能。 3. **DNS协议理解**:在使用Erlang进行DNS解析时,理解DNS协议的基础知识至关重要。DNS查询通常分为两种类型...

    erlang 中文基础教程

    在Erlang Shell中,你可以像使用计算器一样进行简单的算术运算,如`2+5.`,其中`.`是必要的结束符号,表示计算完成。Shell会返回结果`7`,并在下一行显示出新的提示符`2&gt;`。这种即时反馈的特性使得Erlang Shell成为...

    erlang写的一个特别的web服务器

    总的来说,emongrel2是Erlang对Mongrel2的实现,它结合了Erlang的并发优势和Mongrel2的设计理念,旨在构建一个高性能、可扩展、安全的Web服务器。对于熟悉Erlang和想要在高并发场景下部署Web服务的开发者来说,这是...

    硝烟中的erlang

    在程序员学习新的语言和环境时,都需要一个摸索 阶段,也就是学会在社团的帮助下,脱离指南,解决实际问题。 本书假设读者精通基本的Erlang和OTP框架。在本书中,会对一些难以理解Erlang/OTP特性进 行解释,另外,...

    Erlang中文手册.pdf

    - **2.4.6 删除一个事件处理函数**:如何从事件管理器中移除事件处理器。 - **2.4.7 停止**:停止事件管理器的方法。 - ***.*.*.* 在监督树中**:停止方式1。 - ***.*.*.* 独占式事件管理器**:停止方式2。 ###...

    Erlang的高级特性和应用

    Erlang 是一种高级编程语言,以其在并发处理、分布式计算和高可靠性方面的出色性能而闻名。在国内外,Erlang 已经被广泛应用于各种场景,如广告平台、社交网络、云计算、网络游戏以及实时通信等领域。 **Erlang 在...

    erlang 中文乱码

    例如,如果你尝试读取一个GBK编码的中文文件,而Erlang假设它是UTF-8,那么你将看到乱七八糟的字符。 要解决Erlang中的中文乱码问题,你需要确保以下几个方面都正确无误: 1. **文件编码**:确认你要处理的文件是...

    <27>erlang record

    在Erlang中,Records是由一个特殊的语法创建的,形如`#record_name{field1 = value1, field2 = value2, ...}`。Record_name是记录的名称,field1、field2等是记录的字段,value1、value2等则是这些字段对应的值。...

    Erlang_CNode用户指

    CNode是Erlang生态系统中的一个重要组件,它允许Erlang虚拟机(VM)与用其他语言(如C)编写的程序进行交互。CNode提供了一种方式,使得开发者可以利用Erlang的并发特性和强大错误处理能力,同时利用C语言的高效性能...

    Erlang 中的Module级别热部署

    当一个模块被加载到Erlang虚拟机(VM)时,它的代码会被编译并驻留在内存中。热部署就是指在不重启VM或应用程序的情况下,更新这些驻留在内存中的模块代码。 进行模块级别热部署的步骤通常包括以下几点: 1. **...

    Erlang入门:构建application练习2

    在本教程中,我们将深入探讨如何使用Erlang构建一个名为"Application"的基本应用程序,这在Erlang生态系统中是一个关键的概念。 在Erlang中,"Application"是一个组织代码的机制,它提供了模块之间的依赖管理和启动...

    Erlang官网下载过慢

    标题中提到的“Erlang官网下载过慢”可能是因为网络问题或者官方服务器的繁忙导致的,这对于急需安装或更新Erlang的开发者来说是一个常见问题。在这种情况下,用户可以选择通过第三方镜像站点或者从他人分享的安装包...

Global site tag (gtag.js) - Google Analytics