使用Haskell抓取网站的库的当前状态是什么?
我正努力让自己在Haskell中完成更多快速的一次性任务,以帮助提高我对语言的舒适度。
在Python中,我倾向于使用优秀的PyQuery库。在Haskell中有类似简单易用的东西吗?我看过Tag Soup,虽然解析器本身看起来不错,但实际遍历页面并不像其他语言那样好看。
那里有更好的选择吗?
从我在Haskell邮件列表中的搜索看来,TagSoup似乎是解析页面的主要选择。例如:http://www.haskell.org/pipermail/haskell-cafe/2008-August/045721.html
至于网页抓取的其他方面(例如抓取,抓取和缓存),我搜索了http://hackage.haskell.org/package/这些关键字,但没有找到任何有希望的东西。我甚至浏览了提到“http”的软件包,但没有任何东西跳出来。
注意:我不是常规的Haskeller,所以我希望其他人可以在我错过的时候插话。
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可能是一个很好的替代品)
虽然我现在仍然是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,可以确保维护。
编辑:请注意我关于基于镜头的解析的新答案。我留下了这个答案,因为它本身仍然很好,但现在我个人宁愿使用另一种方法。
我已经写了这个问题的另一个答案,建议基于CSS选择器的解析,但是这个答案现在已经有一年半了,而现在我认为镜头在haskell中可能是更好的方法。实际上,您可以使用类型安全的编译选择器。
有关这方面的几个选项,请参见this reddit discussion。如果链接消失,我复制直接链接:
我还没有使用过这些,但如果我今天要编写解析HTML的新代码,我肯定会采用基于镜头的方法。