2011-09-08 21 views
6

ウィキペディアは、すべての記事にリンクを提供しています(pdfとして記事をダウンロードしてください)。私は最初にWikipediaのリンクを取得してレンダリングリンクを出力する小さなHaskellスクリプトを書いた。私はレンダリングURLを入力として与えていますが、空のタグを取得していますが、ブラウザの同じURLにダウンロードリンクがあります。wikipediaからpdfファイルをダウンロード

誰かがこの問題を解決する方法を教えてください。コードは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 
+0

ここでリダイレクトをサポートしてStringにURLをダウンロードするための迅速かつ汚い機能です// www.youtube.com/watch?v=juBDM3fb-i0 –

答えて

5

あなたはwgetのようないくつかの外部ツールからURLを要求しようとした場合、あなたはウィキペディアは直接結果ページを提供していないことがわかります。実際には302 Moved Temporarilyリダイレクトを返します。

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

代わりにNetwork.Browserモジュールを使用します。リクエストがどのように行われるかをより詳細に制御できます。特に、setAllowRedirects関数は自動的にリダイレクトに従います。直接PDFファイルをダウンロードしたいとHTTPを参照してください、それを行う方法を知らない人のために

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 
関連する問題