代码之家  ›  专栏  ›  技术社区  ›  Maik Klein

无法从某些网站读取html

  •  3
  • Maik Klein  · 技术社区  · 11 年前
    openUrl :: String -> MaybeT IO String
    openUrl url = 
        case parseURI url of
          Nothing -> fail ""
          Just u -> liftIO (getResponseBody =<< simpleHTTP (mkRequest GET u))
    

    我正在学习Haskell,我从一个非常简单的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>
    ....
    

    知道为什么会这样吗?

    编辑:

    我不是一个网络人,但他们似乎正在对自己的html进行编码,并通过javascript对其进行解码。

    1 回复  |  直到 3 年前
        1
  •  3
  •   Sibi    11 年前

    这将正确下载内容:

    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 field将使用函数动态解压缩gzip数据 browserDecompress .