使用Haskell下载维基百科标记

时间:2014-08-05 19:00:05

标签: haskell wiki-markup http-conduit

使用http-conduit我想为任何页面下载原始维基媒体标记,例如维基百科页面Stack Overflow

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

注意:此问题立即以问答形式回答,因此故意不显示研究工作!

1 个答案:

答案 0 :(得分:3)

此问题使用http-conduit中的查询参数,如in this previous SO answer所述。

我们将使用here on SO描述的方法下载页面的标记内容。

虽然使用mediawiki可以执行此任务,但在未明确使用API​​的情况下使用?action=raw方法似乎更为简单。

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

{-# 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"

请注意,最新的http-conduit版本是必需的(最低:2.1,使用2.1.4进行测试)以编译代码。