使用Haskell进行网页搜索

ric*_*ree 51 haskell html-parsing web-scraping

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

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

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

那里有更好的选择吗?

scl*_*clv 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"
Run Code Online (Sandbox Code Playgroud)

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


Dav*_* J. 22

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

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

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

  • 我可以担保TagSoup:我专门用于一个完全基于HTML抓取的项目.至于HTTP客户端软件包,我特意写了[http-enumerator](http://hackage.haskell.org/package/http-enumerator),因为我没有看到任何好的替代品. (8认同)
  • 有一个基于TagSoup构建的手术刀https://github.com/fimad/scalpel (3认同)

Emm*_*ery 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.

这个问题与此有关: 是否可以在Haskell中的HXT上使用Text或ByteString?

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

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


Emm*_*ery 6

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

有关方面的几个选项,请参阅此reddit讨论.如果链接消失,我复制直接链接:

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