kee*_*ing 6 tag-soup haskell http
维基百科在每篇文章中提供了一个链接(打印/导出的左侧),以PDF格式下载文章.我写了一个小的Haskell脚本,它首先获取Wikipedia链接并输出渲染链接.当我将渲染网址作为输入时,我得到空标记但是浏览器中的相同网址提供了下载链接.
有人可以告诉我如何解决这个问题?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
Run Code Online (Sandbox Code Playgroud)
如果您尝试通过某些外部工具请求URL wget,您将看到Wikipedia不直接提供结果页面.它实际上返回一个302 Moved Temporarily重定向.
在浏览器中输入此URL时,它会没问题,因为浏览器会自动遵循重定向.simpleHTTP但是,不会.simpleHTTP顾名思义,它很简单.它不处理cookie,SSL或重定向等内容.
您将要使用该Network.Browser模块.它提供了对请求完成方式的更多控制.特别是,该setAllowRedirects功能将使其自动跟随重定向.
这是一个快速而脏的功能,可以将URL下载到String支持重定向的位置:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
363 次 |
| 最近记录: |