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

저는 하스켈을 배우려고 노력 중이며 매우 간단한 html 스크래퍼로 시작했습니다. 대부분의 사이트에서 작동하지만 읽을 수없는 사이트가있어서 그 이유가 궁금합니다.일부 웹 사이트에서 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을 인코딩 및 자바 스크립트를 통해 그것을 디코딩하는 것으로 보인다.

+1

하스켈 코드에 문제가 있다고 생각하지 않습니다. 'kickass.to '에'컬 '을하면 같은 문제가 발생합니다. – Sibi

+0

@Sibi 웹 개발 경험이 없습니다. 이 같은 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으로 압축 된 데이터를 압축 해제됩니다.

관련 문제