使用Haskell下载wikipedia标记

使用Haskell下载wikipedia标记,haskell,wiki-markup,http-conduit,Haskell,Wiki Markup,Http Conduit,使用我想下载任何页面的原始wikimedia标记,例如Wikipedia页面堆栈溢出 此外,我希望该解决方案适用于除en.wikipedia.org以外的维基媒体页面,例如de.wikibooks.org 注意:此问题立即以问答形式得到回答,因此故意不表示研究努力 如前所述,此问题在http管道中使用查询参数 我们将使用所描述的方法下载页面的标记内容 虽然使用可以完成此任务,但在不显式使用API的情况下使用?action=raw方法似乎要简单得多 为了支持不同的页面(例如en.wikimedia

使用我想下载任何页面的原始wikimedia标记,例如Wikipedia页面
堆栈溢出

此外,我希望该解决方案适用于除
en.wikipedia.org
以外的维基媒体页面,例如
de.wikibooks.org


注意:此问题立即以问答形式得到回答,因此故意不表示研究努力

如前所述,此问题在http管道中使用查询参数

我们将使用所描述的方法下载页面的标记内容

虽然使用可以完成此任务,但在不显式使用API的情况下使用
?action=raw
方法似乎要简单得多

为了支持不同的页面(例如
en.wikimedia.org
),我编写了两个函数
getWikipediaPageMarkup
getEnwikiPageMarkup
,前者更通用,允许使用自定义域(假设Mediawiki安装在
/wiki
下,任何域都可以工作)

{-#语言重载字符串}
导入Network.HTTP.conductor
导入Data.ByteString(ByteString)
将限定数据.ByteString.Char8作为B导入
将限定数据.ByteString.Lazy.Char8作为LB导入
导入Network.HTTP.Types(urlEncode)
导入数据。Monoid(())
--|启动Mediawiki
getWikipediaPageMarkup::ByteString--^wikipedia域,例如“en.wikipedia.org”
->ByteString--^要下载的维基百科页面标题
->IO LB.ByteString--^维基百科页面标记
getWikipediaPageMarkup域页面=do
让url=“https://”域“/wiki/”url编码为真实页面
请求IO LB.ByteString
getEnwikiPageMarkup=getWikipediaPageMarkup“en.wikipedia.org”
请注意,为了编译代码,需要使用最新的
http导管
版本(最低版本:
2.1
,使用
2.1.4
进行测试)

{-# LANGUAGE OverloadedStrings #-}
import Network.HTTP.Conduit
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as B
import qualified Data.ByteString.Lazy.Char8 as LB
import Network.HTTP.Types (urlEncode)
import Data.Monoid ((<>))

-- | Get the Mediawiki marup
getWikipediaPageMarkup :: ByteString -- ^ The wikipedia domain, e.g. "en.wikipedia.org"
                       -> ByteString -- ^ The wikipedia page title to download
                       -> IO LB.ByteString -- ^ The wikipedia page markup
getWikipediaPageMarkup domain page = do
    let url = "https://" <> domain <> "/wiki/" <> urlEncode True page
    request <- parseUrl $ B.unpack url
    let request' = setQueryString [("action", Just "raw")] request
    fmap responseBody $ withManager $ httpLbs request'

-- | Like @getWikipediaPageMarkup@, but hardcoded to 'en.wikipedia.org'
getEnwikiPageMarkup :: ByteString -> IO LB.ByteString
getEnwikiPageMarkup = getWikipediaPageMarkup "en.wikipedia.org"