<p>正如其他人在他们的评论中所说的,你真的不想通过迭代输入作为一系列字符来编写HTML解析器。您的代码片段对<code>tell()</code>和<code>read()</code>方法的引用表明,您是从遍历打开的文件的角度来考虑这一点的,而不是从更高的层次(将文档作为字符串读入缓冲区)来考虑这一点。在</p>
<p>有许多工具已经编写,免费提供,广泛测试,良好的维护和广泛赞誉,它们是专门为您执行这类任务而设计的。到目前为止,其中最受欢迎的是一个名为“beauthoulsoup”的程序,它以其健壮性和对“真实世界”中的HTML的容忍度而闻名。beauthulsoup的目标大致上是解析浏览器可以合理显示的任何HTML。因此,它可以处理HTML中各种极为常见的错误——嵌套不当的标记、缺少结束标记的容器、非标准的“标记”以及具有非标准和格式错误的属性和属性=值对的标记等等。在</p>
<p>下面是一个非常简单的使用BeautifulGroup的Python代码示例:</p>
<pre><code>#!/bin/env python
import urllib2
from BeautifulSoup import BeautifulSoup
def get_page(url):
fetcher = urllib2.urlopen(url)
results = fetcher.read()
fetcher.close()
return results
def find_tags(data):
results = list()
parser = BeautifulSoup(data)
results.extend(parser.findAll())
return results
if __name__ == '__main__':
import sys, time
for url in sys.argv[1:]:
html=get_page(url)
for n, each in enumerate([str(x) for x in find_tags(html)]):
print n, each, '\n\n\n'
</code></pre>
<p>。。。如你所见,对BeautifulSoup的引用只占了这里的几行。剩下的就是获取HTML并打印结果。在</p>
<p>顺便说一句,这些结果并不是您所要寻找的,因为它们表示从最外层向下遍历每个HTML容器及其组件,然后再遍历及其组件,在你的代码中,你可能需要遍历这棵树,确定你什么时候在叶子上,然后以某种方式捕捉文本/内容或标记/代码。您需要阅读<a href="http://www.crummy.com/software/BeautifulSoup/documentation.html" rel="nofollow">BeautifulSoup: Documentation</a>,以获得更精确地满足您的需求的详细信息。在</p>