6

ウィキペディアでは、すべての記事にpdfとしてダウンロードするためのリンク(印刷/エクスポートの左側)が用意されています。最初にウィキペディアのリンクを取得してレンダリングリンクを出力する小さなHaskellスクリプトを作成しました。レンダリングURLを入力として指定すると、空のタグが表示されますが、ブラウザーの同じURLでダウンロードリンクが提供されます。

誰かがこの問題を解決する方法を教えてもらえますか?ideoneのフォーマットされたコード

import Network.HTTP
import Text.HTML.TagSoup
import Data.Maybe

parseHelp :: Tag String -> Maybe String 
parseHelp ( TagOpen _ y ) = if any ( \( a , b ) -> b == "Download a PDF version of this wiki page" ) y 
                      then Just $  "http://en.wikipedia.org" ++   snd (   y !!  0 )
                   else Nothing


parse :: [ Tag String ] -> Maybe String
parse [] = Nothing 
parse ( x : xs ) 
   | isTagOpen x = case parseHelp x of 
              Just s -> Just s 
              Nothing -> parse xs
   | otherwise = parse xs


main = do 
    x <- getLine 
    tags_1 <-  fmap parseTags $ getResponseBody =<< simpleHTTP ( getRequest x ) --open url
    let lst =  head . sections ( ~== "<div class=portal id=p-coll-print_export>" ) $ tags_1
        url =  fromJust . parse $ lst  --rendering url
    putStrLn url
    tags_2 <-  fmap parseTags $ getResponseBody =<< simpleHTTP ( getRequest url )
    print tags_2
4

1 に答える 1

5

のような外部ツールを使用してURLをリクエストしようとするwgetと、ウィキペディアが結果ページを直接提供しないことがわかります。実際には302 Moved Temporarilyリダイレクトを返します。

ブラウザにこのURLを入力すると、ブラウザは自動的にリダイレクトに従うため、問題ありません。simpleHTTPただし、そうではありません。simpleHTTP名前が示すように、かなり単純です。Cookie、SSL、リダイレクトなどは処理しません。

Network.Browser代わりにモジュールを使用することをお勧めします。リクエストの実行方法をより細かく制御できます。特に、このsetAllowRedirects関数は自動的にリダイレクトに従うようにします。

StringリダイレクトをサポートするURLをにダウンロードするための迅速で汚い関数は次のとおりです。

import Network.Browser

grabUrl :: String -> IO String
grabUrl url = fmap (rspBody . snd) . browse $ do
    -- Disable logging output
    setErrHandler $ const (return ())
    setOutHandler $ const (return ())

    setAllowRedirects True
    request $ getRequest url
于 2011-09-10T01:41:29.767 に答える