Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео. И, конечно, не забывайте о лайках.
Пример парсинга страницы https://en.wikipedia.org (urllib.request и html.parser)
Сегодня приведу простой пример парсинга реальной Интернет-страницы. Для этого следует вспомнить о urllib.request и html.parser. Ну и если забыли стандартную работу с файлами, посмотрите здесь, здесь и здесь. Как и ранее мы переопределяем некоторые методы класса HTMLParser, объект которого обрабатывает html-страницу.
Если взглянуть на страницу англоязычной Википедии, то там есть счетчик статей.
Он меняется динамически и есть смысл проверять время от времени количество статей в свободной энциклопедии.
Парсинг всегда требует предварительного анализа текста страницы, в частности изучения как раз того места, где этот счетчик находится. Это легко сделать например в браузере, запросив код страницы. Вот этот кусочек кода, который нам интересен.
<div id="articlecount"><a href="/wiki/Special:Statistics" title="Special:Statistics">6,763,350</a> articles in<a href="/wiki/English_language" title="English language">English</a></div>
Почему я взял вложенные тэги, а не один тег <a>? Такой вариант также возможен, так как атрибут "/wiki/English_language" однозначно идентифицирует этот тэг. В качестве упражнения попробуйте упростить представленную ниже программу, идентифицируя сразу тэг <a>. Наш вариант чуть посложнее, но часто идентификацию нужного элемента приходится делать на основе двух и более тэгов. Таким образом, мы находим в начале внешний тэг <div> по атрибуту 'articlecount', а потом внутри него тэг <a> по атрибуту "/wiki/English_language". Мы также учитываем следующие моменты:
- Пропуск тэгов <div> без атрибутов. Условие if len(atr) > 0.
- Наличие внешнего тэга, но отсутствие в нём внутреннего тэга. Обработка handle_endtag(self, tag).
Обращаем внимание на флаг self.fl. Если self.fl=1, то найден внешний тэг. Если self.fl=2, то найден внутренний тэг. Тогда срабатывает обработчик handle_data(self, data). В этом обработчике после вывода содержимого тэга мы сбрасываем флаг self.fl в нуль.
Результат выполнения программы
6,763,350
Понятно, что цифра будет постепенно меняться (увеличиваться, скорее всего) и парсинг позволяет динамически отслеживать её изменения.
Замечание
Как я уже отмечал код программы для данной web-страницы можно сделать проще. Однако в других страницах обработка может оказаться гораздо сложнее. Просто алгоритм парсинга может сильно зависеть от конкретной структуры страницы.
Пишите свои предложения и замечания и занимайтесь программированием, хотя бы для поддержания уровня интеллекта.