Как уже говорили другие в своих комментариях, вы действительно не хотите пытаться написать HTML-парсер, перебирая ввод в виде последовательности символов. Ссылки вашего фрагмента кода на методы tell()
и read()
предполагают, что вы думаете об этом с точки зрения обхода открытого файла, а не даже на более высоком уровне (документ читается в буфер в виде строки).
Существует целый ряд уже написанных, свободно доступных, широко протестированных, хорошо обслуживаемых и широко признанных инструментов, специально разработанных для выполнения подобных задач. Самый популярный из них, безусловно, называется «BeautifulSoup», который славится своей надежностью и толерантностью к типу HTML, встречающемуся «в реальном мире». Целью BeautifulSoup, грубо говоря, является анализ любого HTML-кода, который разумно отобразит ваш браузер. Таким образом, он может обрабатывать множество самых распространенных ошибок в HTML - неправильно вложенные теги, контейнеры с отсутствующими закрывающими тегами, нестандартные теги и теги с нестандартными и плохо сформированными атрибутами и парами атрибут = значение и так далее.
Вот очень простой пример кода Python, использующего BeautifulSoup:
#!/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'
... как вы можете видеть, ссылки на BeautifulSoup учитывают только несколько строк здесь. Остальное - выборка HTML и печать результатов.
Эти результаты, кстати, не совсем то, что вы ищете, поскольку они представляют глубинный обход каждого HTML-контейнера от самого нижнего уровня до и его компонентов, а затем через и его компоненты и т. Д. В вашем коде вы, вероятно, захотите пройтись по этому дереву и определить, когда вы находитесь на листе, а затем каким-то образом захватить текст / содержимое или теги / код. Вы можете прочитать BeautifulSoup: Документация для деталей, которые будут более точно соответствовать вашим потребностям.