基本上,我正在设计一个网络搜索引擎,因此我设计了一个抓取工具来获取网页。
阅读时,网页采用html格式,因此所有标签都在那里。我需要从正文和标题中提取关键字,因此我尝试删除所有标记('<'和'>'之间的任何内容)
下面的代码适用于小型html页面,但是当我尝试大规模使用它时(即从http://www.google.com开始),我的内存不足。
0 def remove_tags(self, s):
1 while '<' in s:
2 start = s.index('<')
3 end = s.index('>')
4 s = s[:start] + " " + s[end+1:]
5 return s.split()
内存错误发生在第4行。如何修复代码以便获取s的子字符串不会消耗过多的内存?
答案 0 :(得分:8)
你的一般做法是错误的。首先,使用真正的XML / HTML解析器。像BeautifulSoup这样的东西,当涉及到糟糕的HTML时,这是宽容的。查看<
和>
的方法将无法存活很长时间。
其次,你已经将整个事物读入记忆中并在那里玩它。这是内存消耗,你正在做的一些操作可能会创建副本,这也不是一件好事。相反,迭代输入流并在看到数据时对其进行处理。将remove_tags
视为输入的过滤器而不是文本处理函数。