6

维基百科在每篇文章上都提供了一个链接(打印/导出左侧),以将文章下载为 pdf。我写了一个小 Haskell 脚本,它首先获取 Wikipedia 链接并输出渲染链接。当我将渲染 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,您将看到 Wikipedia 不会直接提供结果页面。它实际上返回一个302 Moved Temporarily重定向。

在浏览器中输入此 URL 时会很好,因为浏览器会自动跟随重定向。simpleHTTP,但是,不会。simpleHTTP顾名思义,是相当简单的。它不处理诸如 cookie、SSL 或重定向之类的事情。

您将希望使用该Network.Browser模块。它提供了对如何完成请求的更多控制。特别是,该setAllowRedirects功能将使其自动跟随重定向。

这是一个快速而肮脏的功能,用于将 URL 下载到String支持重定向的 a 中:

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 回答