Я использовал pyparsing для ряда проектов очистки страниц HTML.Это своего рода золотая середина между BeautifulSoup и парсерами полного HTML на одном конце, и слишком низкоуровневый подход к регулярным выражениям (таким образом - безумие).
С помощью pyparsing вы часто можете получитьхорошие результаты анализа HTML-данных путем определения конкретного подмножества страницы или данных, которые вы пытаетесь извлечь.Этот подход позволяет избежать попыток разбора всего на странице, поскольку некоторые проблематичные HTML-коды за пределами области вашего интереса могут вызвать сложный анализатор HTML.
Хотя это звучит как простоПодход, основанный на регулярных выражениях, pyparsing предлагает встроенные функции для работы с HTML- или XML-тегами.Pyparsing позволяет избежать многих ловушек, которые расстраивают решения на основе регулярных выражений:
- принимает пробелы без символа «\ s *» по всему выражению
- обрабатывает неожиданные атрибуты внутри тегов
- обрабатывает атрибуты в любом порядке
- обрабатывает верхний / нижний регистр в тегах
- обрабатывает имена атрибутов с помощью пространств имен
- обрабатывает значения атрибутов в двойных кавычках, одинарных кавычках или нет кавычки
- обрабатывает пустые теги (теги вида
<blah />
) - возвращает проанализированные данные тега с доступом к атрибутам объекта к атрибутам тега
Вот простой пример из pyparsing wiki, который получает <a href=xxx>
тегов с веб-страницы:
from pyparsing import makeHTMLTags, SkipTo
# read HTML from a web page
page = urllib.urlopen( "http://www.yahoo.com" )
htmlText = page.read()
page.close()
# define pyparsing expression to search for within HTML
anchorStart,anchorEnd = makeHTMLTags("a")
anchor = anchorStart + SkipTo(anchorEnd).setResultsName("body") + anchorEnd
for tokens,start,end in anchor.scanString(htmlText):
print tokens.body,'->',tokens.href
Это вытянет теги <a>
, даже если есть другие части страницы, содержащиепроблемный HTML.На вики-странице pyparsing есть и другие примеры HTML:
Pyparsing не является полностью надежным решением этой проблемы, но, предоставляя вам процесс разбора, вы можете лучше контролировать, какие фрагменты HTML вам интересны, обрабатывать их и пропускать остальные.