Я использовал pyparsing для нескольких проектов соскабливания HTML-страниц. Это своего рода промежуточная точка между BeautifulSoup и полными HTML-парсерами на одном конце, а также слишком низкий уровень регулярных выражений (таким образом, это безумие).
С помощью pyparsing вы можете часто получать хорошие результаты HTML-поиска, идентифицируя конкретное подмножество страницы или данных, которые вы пытаетесь извлечь. Этот подход позволяет избежать вопросов, связанных с попыткой разобрать все на странице, так как какой-то проблематичный HTML за пределами интересующего вас региона может отбросить всеобъемлющий парсер HTML.
Хотя это похоже только на прославленный подход с регулярным выражением, pyparsing предлагает встроенные функции для работы с текстом HTML или XML. Pyparsing позволяет избежать многих ошибок, которые расстроить регулярные выражения на основе решения:
- принимает пропуска без захламления «\ с *» все над выражением
- обрабатывает неожиданные атрибуты в тегах
- обрабатывает атрибуты в любом порядке
- обрабатывает верхний/нижний регистр в тегах
- ручки имен атрибутов с пространствами имен
- ручки значений атрибутов в двойные кавычки, одинарные кавычки, или нет котировки
- обрабатывает пустые тег (эти формы
<blah />
)
- возвращает разобранные данные тегов с доступом объекта-атрибутом для атрибутов тега
Вот простой пример из Pyparsing вики, которая получает <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.Есть и другие примеры HTML на Pyparsing вики:
Pyparsing не полное решение несложный этой проблемы, но, подвергнув процесс синтаксического анализа вам, вы можете лучше контролировать, какие фрагменты HTML, которые вы специально интересуете, обрабатываете их и пропускаете отдых.
Вам нужно привести примеры страниц, с которыми не справляются текущие подходы. В противном случае, как мы узнаем, помогут ли наши предлагаемые решения решить ваши проблемы? Кроме того, не забудьте сообщить об ошибках html5lib на странице http://code.google.com/p/html5lib/issues/entry –