目前Haskell中用于网站爬取的库处于什么状态?
为了提高自己对这门语言的熟练程度,我正在尝试使用Haskell处理更多的日常任务。
在Python中,我通常使用优秀的PyQuery库来完成这项工作。有没有类似于PyQuery简单易用的Haskell库呢?我已经研究了Tag Soup,虽然解析器本身很好,但是与其他语言相比,页面遍历起来似乎不是那么方便。
是否有更好的选择呢?
目前Haskell中用于网站爬取的库处于什么状态?
为了提高自己对这门语言的熟练程度,我正在尝试使用Haskell处理更多的日常任务。
在Python中,我通常使用优秀的PyQuery库来完成这项工作。有没有类似于PyQuery简单易用的Haskell库呢?我已经研究了Tag Soup,虽然解析器本身很好,但是与其他语言相比,页面遍历起来似乎不是那么方便。
是否有更好的选择呢?
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可能是一个好的替代品)
web-encodings
,而web-encodings
又依赖于过时的库。是否有更新的替代方案? - unhammer从我在Haskell邮件列表中的搜索结果来看,TagSoup是解析网页的主要选择。例如:http://www.haskell.org/pipermail/haskell-cafe/2008-August/045721.html
至于Web抓取(如爬行、蜘蛛和缓存)的其他方面,我在http://hackage.haskell.org/package/上搜索了这些关键词,但没有找到什么有前途的东西。我甚至浏览了提到“http”的软件包,但没有什么特别引人注目的。
注意:我不是一个常规的 Haskell 用户,所以如果我错过了什么,希望其他人能发表评论。
http://egonschiele.github.com/HandsomeSoup/
http://codingtales.com/2012/04/25/scraping-html-with-handsomesoup-in-haskell
这个页面关于HXT,它是HandsomeSoup所依赖的,将会对你有所帮助(你需要使用getText或deep getText):http://adit.io/posts/2012-04-14-working_with_HTML_in_haskell.html
但另一个选择是dom-selector:
http://hackage.haskell.org/package/dom-selector
现在它是alpha版本,长期维护可能会成为一个问题。dom-selector的优点是,我无法使用HandsomeSoup处理Unicode字符。但是,dom-selector可以直接使用Unicode字符。
这个问题与以下内容相关: 在Haskell的HXT中是否可以使用Text或ByteString?
dom-selector基于html-conduit和xml-conduit,它们的维护似乎有保障。
编辑:请注意我的新答案,它基于lens解析。尽管本回答仍然很好,但我现在更倾向于使用其他方法。