无法从某些网站阅读HTML

时间:2014-02-25 16:07:01

标签: html http haskell encoding web-scraping

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>
....

知道为什么会这样吗?

编辑:

我不是webguy,但似乎他们正在编码他们的html并通过javascript解码。

1 个答案:

答案 0 :(得分: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压缩数据。