使用Haskell进行网页搜索

问题描述 投票:50回答:4

使用Haskell抓取网站的库的当前状态是什么?

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

在Python中,我倾向于使用优秀的PyQuery库。在Haskell中有类似简单易用的东西吗?我看过Tag Soup,虽然解析器本身看起来不错,但实际遍历页面并不像其他语言那样好看。

那里有更好的选择吗?

haskell html-parsing web-scraping
4个回答
22
投票

从我在Haskell邮件列表中的搜索看来,TagSoup似乎是解析页面的主要选择。例如:http://www.haskell.org/pipermail/haskell-cafe/2008-August/045721.html

至于网页抓取的其他方面(例如抓取,抓取和缓存),我搜索了http://hackage.haskell.org/package/这些关键字,但没有找到任何有希望的东西。我甚至浏览了提到“http”的软件包,但没有任何东西跳出来。

注意:我不是常规的Haskeller,所以我希望其他人可以在我错过的时候插话。


36
投票

http://hackage.haskell.org/package/shpider

Shpider是Haskell的Web自动化库。它允许您快速编写爬虫,以及简单的情况(如下面的链接),即使不读取页面源。

它具有有用的功能,例如将相对链接从页面转换为绝对链接,仅在给定域上授权事务的选项,以及仅下载html文档的选项。

它还为填写表单提供了一个很好的语法。

一个例子:

 runShpider $ do
      download "http://apage.com"
      theForm : _ <- getFormsByAction "http://anotherpage.com"
      sendForm $ fillOutForm theForm $ pairs $ do
            "occupation" =: "unemployed Haskell programmer"
            "location" =: "mother's house"

(在2018年编辑 - shpider已被弃用,这些天https://hackage.haskell.org/package/scalpel可能是一个很好的替代品)


11
投票

虽然我现在仍然是Haskell的初学者,但我强烈认为2012年的HTML解析必须使用CSS选择器完成,而且到目前为止推荐的库似乎不使用该原理。

一种可能性是HandsomeSoup,它建立在HXT之上:

http://egonschiele.github.com/HandsomeSoup/

http://codingtales.com/2012/04/25/scraping-html-with-handsomesoup-in-haskell

关于HXT的这个页面,HandsomeSoup所依赖的,也会有所帮助(你将需要getText或深度getText):

http://adit.io/posts/2012-04-14-working_with_HTML_in_haskell.html

但另一个选择是选择器:

http://hackage.haskell.org/package/dom-selector

它现在是alpha,它的长期维护可能是一个问题。 dom-selector的优点是我无法使用unicode字符来使用HandsomeSoup。他们开箱即用的dom-selector。

这个问题与此有关:Is it possible to use Text or ByteString on HXT in Haskell?

dom-selector基于html-conduit和xml-conduit,可以确保维护。

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


6
投票

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

有关这方面的几个选项,请参见this reddit discussion。如果链接消失,我复制直接链接:

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

© www.soinside.com 2019 - 2024. All rights reserved.