2014-02-25 59 views
3
openUrl :: String -> MaybeT IO String 
openUrl url = 
    case parseURI url of 
     Nothing -> fail "" 
     Just u -> liftIO (getResponseBody =<< simpleHTTP (mkRequest GET u)) 

我想学习Haskell,我用一个非常简单的html scrapper开始。它适用于大多数网站,但我只是遇到了一些我无法阅读的网站,我想知道为什么。无法从一些网站阅读html

runMaybeT $ openUrl "http://google.com" 

Just "<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<TITLE>302 Moved</TITLE></HEAD><BODY>\n<H1>302 Moved</H1>\nThe document has moved\n<A HREF=\"http://www.google.de/?gfe_rd=cr&amp;ei=270MU9u8LM_esgaQ_YDgDw\">here</A>.\r\n</BODY></HTML>\r\n" 

不出所料,它也适用于大多数网站。但对于一些网站如

runMaybeT $ openUrl "http://kickass.to" 

它导致奇怪的编码。

....223\250ns\147\214\203\235`\188\&0f\SO\182vw\v\200\&0m\195\181\143CY[\223\ETB\n\175\209\240\155\160\240\157\248\189x\231Xa\239\187\194\DEL$\SI\144S\SYN\210\t\DEL\DC2\213\129\DLE \FS\153<\178\135a\239{\246**7y\246:z2t\238m\151\191\181\181\245]\225\205\168\240\221\195^~\186\&8\221\162q\191\233\205\254\198O\225\SYN\233\170\228\ETX\CANt7\203\219\141\&2\175\167\240\221\153\DC1\246\138p\205#\237\250&/\191\193\143\ESColDg\211\&6N1\199\200\128\199\231\&8\154\218\182\231#\"bw\163\188\193\248\b\249'14\250\184\183\243\191 \GS\DC4\182\216\171R\t\130\219\204n O\251\EOT7\206v\176\237mw\183\253mc\187\SI\DLE1\231j\ETX\SOH\130]\215\222G\188\223\CANg\164\131\143mJD\181q\189\235\191q\174\252\235]\250\231_\255z\128\188MzZ\252\133\255X\252\229_\255\186\186\222\DC24\SYNA\DEL\FS\135\193\214\239\219\252\GSwW\253\SI\n#=\130\144\131\237j\236\ACK\SI \234mm\163\139}<\207\EOT\133\183Eh0\138\FS\158\187*>\209\161\238\238\155\254\\x\208\200P#\208\129\204\210\136\175\217\142\247\214vL\r\182\177/)0\ACK)11r\197\136\135\206#\196&\223\NUL\223\237\141\174\SOH\226A'W\186\198\230\134 .D\214?\237+\NAK\181Q%f\166\168\244`*\186 z\GS\183\167q\139\239\DLE\241\DC4\184Z\253\142jJ-P\169\141\203\215I\212\166\251\130\247\254\US\235\RS\156\238\236Z\SOH\NUL.... 

但它似乎是UTF-8

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <meta http-equiv="Content-Style-Type" content="text/css"/> 
... 
<script src="//kastatic.com/js/all-df6d9f0.js" type="text/javascript"></script> 
.... 

任何想法,为什么发生这种情况?

编辑:

我不是webguy但似乎他们自己的编码的HTML和通过JavaScript进行解码。

+1

我不这么认为这是Haskell代码的问题。对'kickass.to'做'curl'会导致同样的问题。 – Sibi

+0

@Sibi我没有web开发经验。这是常见的编码这样的HTML吗? –

+2

这是一个gzip的html,http协议支持压缩的内容。我想你需要解析响应头文件并手动解压缩内容。 – Yuuri

回答

3

这正常下载内容:

import Data.Conduit.Binary (sinkFile) 
import Network.HTTP.Conduit 
import qualified Data.Conduit as C 

main :: IO() 
main = do 
    uri <- parseUrl "http://kickass.to" 
    let request = uri { 
      decompress = browserDecompress 
         } 
    withManager $ \manager -> do 
     response <- http request manager 
     responseBody response C.$$+- sinkFile "kickass.html" 

decompress场将通过使用功能browserDecompress解压缩上飞gzip压缩的数据。