如何使用Clojure懒惰地读取网页

4
我和一个朋友最近在我的Clojure IRC机器人中实现了链接抓取。当它看到一个链接时,它会读取整个页面并从页面中获取标题。问题是,它必须读取整个页面才能抓取链接。如何才能懒惰地读取页面直到第一个标签呢?
2个回答

6

使用 line-seq,但不要忘记在完成后关闭底层流。


我忘记了line-seq。谢谢。 :) - Rayne

6

我不会指望 HTML 能够以合理的方式被拆分成行;例如 Compojure(或者目前的 Hiccup,我猜)并不费心插入换行符,我相信(更新: 刚刚检查了 Hiccup -- 没有换行符)。

我建议使用懒惰的 XML 解析(使用 clojure.contrib.lazy-xml)在 java.io.BufferedInputStream 之上。


3
顺便说一下,我并不是这个领域的专家,但我不认为你可以通过HTTP请求比完整页面源代码更少的内容;不过也没有关系,因为像图片之类的大东西你也拿不到。 slurp*会为您获取源代码上的java.io.BufferedReader,而c.c.lazy-xml将执行可能对性能很重要的一件事情,即解析超出您要查找的<title>...</title>部分之外的任何内容。(哦,我应该把这个包含在回答中吗...?也许下次我会,现在得休息一下了。) - Michał Marczyk
有Range头,但并非所有服务器都支持它。 - Jouni K. Seppänen
我现在的做法并不重要,Line-seq 能满足我的需求。 - Rayne
1
@Jouni K. Seppänen: 啊,好的。谢谢。 @Rayne: 好吧,它不太可能影响你的任何东西(除非你不得不重新连接一些初始行,这似乎是不必要的努力,并且它可能会在面对某些特别丑陋的html时有点脆弱,这取决于您如何查找最后一个有趣的行),但我不确定使用它比c.c.lazy-xml加上c.c.io/reader(在with-open中)给你带来了什么好处。无论如何,祝你愉快的黑客 :-)。 - Michał Marczyk
另一件你不能确定的事情是收到格式良好的XML。我通常通过在尝试将其作为XML处理之前,将我的“松散HTML”输入文本通过JTidy运行来解决这个问题。当然,这样做有点与不阅读整个页面的目标相冲突;所以我只是为了一般的兴趣而提到这一点。 - Carl Smotricz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接