【发布时间】:2011-03-07 16:40:24
【问题描述】:
我是 Erlang 的新手,作为学习练习的一部分,我想用 Erlang 编写一个 HTML 解析器。
我想从网页中提取某些值,可能使用一种模式来描述我想要提取的数据。
谁能给我一些关于他们将如何在 Erlang 中解决这个问题的高级建议?
我认为我需要将文档转换为一堆标记,也许使用有限状态机来跟踪我在嵌套方面的位置以及我在元素中的位置。
【问题讨论】:
标签: erlang html-parsing
我是 Erlang 的新手,作为学习练习的一部分,我想用 Erlang 编写一个 HTML 解析器。
我想从网页中提取某些值,可能使用一种模式来描述我想要提取的数据。
谁能给我一些关于他们将如何在 Erlang 中解决这个问题的高级建议?
我认为我需要将文档转换为一堆标记,也许使用有限状态机来跟踪我在嵌套方面的位置以及我在元素中的位置。
【问题讨论】:
标签: erlang html-parsing
我建议你看看 Mochiweb 中包含的那个:
http://github.com/mochi/mochiweb/blob/master/src/mochiweb_html.erl
parse/1 函数可能是您感兴趣的入口点。
【讨论】:
如果您打算完成这项工作,这是一项艰巨的任务。您最好使用 Roberto 建议的那个,但是如果您决心编写自己的项目来熟悉 Erlang,这里有一些建议...
您应该首先决定是要手动编写解析器还是使用leex and yecc 从语法生成解析器。如果您想学习如何编写惯用的 Erlang,手工编码可能是一种更好的学习体验。编写解析器是向 Erlang 介绍自己的绝佳方式;函数式编程语言擅长实现解析器。
其次,您应该决定是要生成类似 DOM 的结构还是执行类似 SAX 的回调模型,在 Erlang 中称为 behaviour。如果您执行后者,您可以简单地实现创建 DOM 的行为。
如果您查看行为,您可能还想查看parametrized modules。这是一个可以补充行为的实验性功能,允许将不可变状态存储在“模块的实例”中。目前尚不清楚社区是否会支持此新功能。 (对于某些人来说,它看起来太OO了)。
另一个极好的资源是xmerl 代码。密切关注它如何确定字符编码并进行相应的解析。 HTML(各种标准)的工作方式略有不同,但重要的是您在阅读文件时要考虑正确的字符编码。
同样从 xmerl,您可以看到该库如何使用 Erlang 元组构建 DOM。你可能想做类似的事情。
【讨论】: