用Haskell进行网页抓取

用Haskell进行网页抓取,haskell,html-parsing,web-scraping,Haskell,Html Parsing,Web Scraping,使用Haskell抓取网站的库的当前状态如何 我试图让自己在Haskell中完成更多的一次性快速任务,以帮助提高我对语言的舒适度 在Python中,我倾向于为此使用优秀的库。Haskell中是否有类似的简单和容易的东西?我已经研究了标记汤,虽然解析器本身看起来不错,但实际上遍历页面并不像在其他语言中那样好 还有更好的选择吗?从我对Haskell邮件列表的搜索中,TagSoup似乎是解析页面的主要选择。例如: 至于web抓取的其他方面(如爬行、爬行和缓存),我搜索了这些关键字,但没有找到任何有希

使用Haskell抓取网站的库的当前状态如何

我试图让自己在Haskell中完成更多的一次性快速任务,以帮助提高我对语言的舒适度

在Python中,我倾向于为此使用优秀的库。Haskell中是否有类似的简单和容易的东西?我已经研究了标记汤,虽然解析器本身看起来不错,但实际上遍历页面并不像在其他语言中那样好


还有更好的选择吗?

从我对Haskell邮件列表的搜索中,TagSoup似乎是解析页面的主要选择。例如:

至于web抓取的其他方面(如爬行、爬行和缓存),我搜索了这些关键字,但没有找到任何有希望的内容。我甚至浏览了提到“http”的软件包,但什么也没发现

注意:我不是一个普通的哈斯凯尔人,所以如果我错过了什么,我希望其他人能插话。

Shpider是一个web自动化库 哈斯克尔。它可以让你快速 编写爬虫程序,对于简单的情况( 喜欢下面的链接)即使没有 阅读页面源代码

它有一些有用的功能,比如转向 从一个页面到另一个页面的相对链接 绝对链接,授权选项 仅在给定域上执行事务, 以及只下载html的选项 文件

它还为 填写表格

例如:

runShpider$do
下载“http://apage.com"

形式:尽管我现在还是Haskell的初学者,但我强烈认为2012年的HTML解析必须使用CSS选择器完成,目前推荐的库似乎没有使用这一原则

一种可能是在HXT之上构建的HandsomeSoup:

关于HXT的这一页也会很有帮助(您需要getText或deep getText):

但另一种选择是dom选择器:

它现在是alpha,长期维护可能是个问题。dom选择器的优点是,我无法使用unicode字符处理HandsomeSoup。他们使用dom选择器进行开箱即用的工作

这个问题涉及:

dom选择器基于html管道和xml管道,维护似乎是有保证的


编辑:注意我关于基于镜头的解析的最新答案。我留下这个答案是因为它本身仍然很好,但我个人更愿意使用另一种方法。

我已经为这个问题写了另一个答案,建议基于CSS选择器的解析,但是这个答案现在已经有一年半的历史了,现在我认为在haskell中,镜头可能是一种更好的方法。实际上,您得到了类似于类型安全编译选择器的东西

请参阅,以了解这方面的几个选项。如果链接消失,我将复制直接链接:

  • ,显然可以与

我还没有使用过这些工具,但如果我今天要编写解析HTML的新代码,我肯定会使用基于镜头的方法。

Haskell XML工具箱(HXT)可能值得一看:我可以担保TagSoup:我专门用于一个完全基于HTML抓取的项目。至于HTTP客户端软件包,我写这篇文章是因为我没有看到任何好的替代方案。有一个基于TagSoup的手术刀,还有一个声称比TagSoup快8倍的手术刀。你发现TagSoup缺少什么?搜索解析文档的功能似乎比其他语言的库更有限。诸如节之类的通用函数似乎没有那么糟糕,但对于一些真正常见的用途,它仍然需要几行代码。例如,按类选择元素至少需要几行代码来执行jquery中的单个调用。这对于一个项目来说并不坏,但我的典型用例是一个小型一次性项目。所以我要么留下一些帮手,要么重复我自己。我错过什么了吗?很有趣。看起来Spider也可以用于web测试。Michael,你使用它进行测试了吗?我在ghc 7.6.2+/-0:+1上安装Spider时遇到了一个问题—界面很棒,非常直观,Monad的使用非常出色-1不适用于ASPX站点,无法正确解析表单。只寻找一个spider库,这样我就不必处理低级ASPX站点的疯狂行为……这似乎取决于不推荐的
web编码,它依赖于过时的库。有更新的替代品吗?HandsomeSoup是一个非常整洁的库。谢谢分享,否则我就不知道该去哪里找了!
 runShpider $ do
      download "http://apage.com"
      theForm : _ <- getFormsByAction "http://anotherpage.com"
      sendForm $ fillOutForm theForm $ pairs $ do
            "occupation" =: "unemployed Haskell programmer"
            "location" =: "mother's house"