我想知道是否可以编写一个Haskell程序,以便根据需要检查一些小说的更新,而我正在使用的网站是
this.我在显示其内容时出现问题(在mac el capitan上).简单的代码如下:
import Network.HTTP openURL :: String -> IO String openURL = (>>= getResponseBody) . simpleHTTP . getRequest display :: String -> IO () display = (>>= putStrLn) . openURL
然后,当我在ghci上显示“http://www.piaotian.net/html/7/7430/”时,会出现一些奇怪的字符;第一行看起来像这样:
<title>×ß½øÐÞÏÉ×îÐÂÕ½Ú,×ß½øÐÞÏÉÎÞµ¯´°È«ÎÄÔĶÁ_Æ®ÌìÎÄѧ</title> <Meta http-equiv="Content-Type" content="text/html; charset=gbk" /> <Meta name="keywords" content="×ß½øÐÞÏÉ,×ß½øÐÞÏÉ×îÐÂÕ½Ú,×ß½øÐÞÏÉÎÞµ¯´° Æ®ÌìÎÄѧ" /> <Meta name="description" content="Æ®ÌìÎÄѧÍøÌṩ×ß½øÐÞÏÉ×îÐÂÕ½ÚÃâ·ÑÔĶÁ£¬Ç뽫×ß½øÐÞÏÉÕ½ÚĿ¼¼ÓÈëÊղط½±ãÏ´ÎÔĶÁ,Æ®ÌìÎÄѧС˵ÔĶÁÍø¾¡Á¦ÔÚµÚһʱ¼ä¸üÐÂС˵×ß½øÐÞÏÉ£¬Èç·¢ÏÖδ¼°Ê±¸üУ¬ÇëÁªÏµÎÒÃÇ¡£" /> <Meta name="copyright" content="×ß½øÐÞÏÉ°æȨÊôÓÚ×÷ÕßÎáµÀ³¤²»¹Â" /> <Meta name="author" content="ÎáµÀ³¤²»¹Â" /> <link rel="stylesheet" href="/scripts/read/list.css" type="text/css" media="all" /> <script type="text/javascript">
我也试图下载如下文件:
import Network.HTTP openURL :: String -> IO String openURL = (>>= getResponseBody) . simpleHTTP . getRequest downloading :: String -> IO () downloading = (>>= writeFile fileName) . openURL
但下载文件后,就像在照片中:
如果我通过python(使用urllib)下载页面,则会正常显示这些字符.另外,如果我写一个中文HTML并解析它,那么似乎没有问题.因此,似乎问题出在网站上.但是,我看不到网站的字符和我写的字符之间有任何区别.
对此背后的理由的任何帮助都非常感激.
附:
python代码如下:
import urllib urllib.urlretrieve('http://www.piaotian.net/html/7/7430/',theFic) theFic = file_path
文件都很好,很好.
解决方法
由于您表示您对链接感兴趣,因此无需将GBK编码转换为Unicode.
这是一个版本,打印文档中的所有链接,如“123456.html”:
#!/usr/bin/env stack {- stack --resolver lts-6.0 --install-ghc runghc --package wreq --package lens --package tagsoup -} {-# LANGUAGE OverloadedStrings #-} import Network.Wreq import qualified Data.ByteString.Lazy.Char8 as LBS import Control.Lens import Text.HTML.TagSoup import Data.Char import Control.Monad -- match \d+\.html isNumberHtml lbs = (LBS.dropWhile isDigit lbs) == ".html" wanted t = isTagOpenName "a" t && isNumberHtml (fromAttrib "href" t) main = do r <- get "http://www.piaotian.net/html/7/7430/" let body = r ^. responseBody :: LBS.ByteString tags = parseTags body links = filter wanted tags hrefs = map (fromAttrib "href") links forM_ hrefs LBS.putStrLn