を使用しhttp-conduit
て、ウィキペディアのページなど、任意のページの生のウィキメディア マークアップをダウンロードしたいと考えていますStack Overflow
。
また、解決策を 以外のウィキメディア ページにも適用できるようにしたいと考えていen.wikipedia.org
ますde.wikibooks.org
。
注:この質問は Q&A 形式ですぐに回答されたため、意図的に研究努力を示していません。
を使用しhttp-conduit
て、ウィキペディアのページなど、任意のページの生のウィキメディア マークアップをダウンロードしたいと考えていますStack Overflow
。
また、解決策を 以外のウィキメディア ページにも適用できるようにしたいと考えていen.wikipedia.org
ますde.wikibooks.org
。
注:この質問は Q&A 形式ですぐに回答されたため、意図的に研究努力を示していません。
この質問では、この前の SO 回答 で説明されているように、http-conduit でクエリ パラメータを使用します。
SO で説明されている方法を使用して、ページのマークアップ コンテンツをダウンロードします。
このタスクはmediawikiを使用しても可能です?action=raw
が、API を明示的に使用せずにメソッドを使用する方がはるかに簡単に思えます。
異なるページ (例: en.wikimedia.org
) をサポートするために、2 つの関数getWikipediaPageMarkup
とgetEnwikiPageMarkup
を作成しました。前者はより一般的で、カスタム ドメインを使用できます (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