im试图将链接分析仪整合在一起,该链接分析器浏览网站html代码并返回包含相同基础URL的所有链接(请参阅同一网站的网页(,而IM当前有此代码放在一起。(我是初学者,所以请使用业余代码^^(:
import Network.HTTP
import Data.List
import Data.Char
htmlLinks link = do
content <- simpleHTTP (getRequest link) >>= fmap (take 10000) . getResponseBody
let string = content
let tags = splitOn "<" string
let links = filter (isInfixOf "href") tags
let filtered = filter (isInfixOf link) links
let url = map (splitOn """) filtered
let final = map (filter (isInfixOf "http")) url
let urlString = map ((h:_) -> h)final
let result = nub urlString
--let result = map head $ group $ sort urlString
return result
此功能通过代码,并返回了所有链接的列表,这些链接具有与我想要的基本URL相同的基本URL。现在,我想浏览该列表的每个元素并将相同的功能应用于它们,以便我可以在每个网站上获得链接,最终为我提供给定网站结构的所有网页。因此,对于递归功能,我尝试了以下操作:
linkScanner result = linkRec [] result where
linkRec acc [] = acc
linkRec acc (h:t) = linkRec ((htmlLinks h) : acc) t
这基本上是将链接列表应用于每个元素的HTMLLINK,并将其添加到我的累加器中,在这种情况下,这是一个空列表。现在我的问题是,我找不到一种结合这两个功能的方法,以便可以使用给定的URL执行它们,并为我提供所需的所有链接的列表。我也有类型的冲突,因为htmllinks是类型IO [string],递归功能需要一个[字符串]导致错误。
我正在寻找一些有关如何解决此问题或可以使用的技巧来达到所需结果的建议。所有的帮助都非常感谢!
您可能想要
之类的东西linkScanner result = linkRec [] result where
linkRec acc [] = return acc
linkRec acc (h:t) = do
x <- htmlLinks h
linkRec (x : acc) t
(将以相反的顺序返回列表(或
linkScanner = traverse htmlLinks -- or the analogous with mapM
顺便说一句,您应该真正将类型注释添加到顶级绑定。很难考虑发生的情况。