Найти тему
programmer's notes (python and more)

Программирование на языке Python. Простой пример парсинга web-страницы (urllib.request и html.parser)

Доброго времени суток, читатели, зрители моего канала 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". Мы также учитываем следующие моменты:

  1. Пропуск тэгов <div> без атрибутов. Условие if len(atr) > 0.
  2. Наличие внешнего тэга, но отсутствие в нём внутреннего тэга. Обработка handle_endtag(self, tag).

Обращаем внимание на флаг self.fl. Если self.fl=1, то найден внешний тэг. Если self.fl=2, то найден внутренний тэг. Тогда срабатывает обработчик handle_data(self, data). В этом обработчике после вывода содержимого тэга мы сбрасываем флаг self.fl в нуль.

Текст программы см. ниже
Текст программы см. ниже
primer185.py

Результат выполнения программы

6,763,350

Понятно, что цифра будет постепенно меняться (увеличиваться, скорее всего) и парсинг позволяет динамически отслеживать её изменения.

Замечание
Как я уже отмечал код программы для данной web-страницы можно сделать проще. Однако в других страницах обработка может оказаться гораздо сложнее. Просто алгоритм парсинга может сильно зависеть от конкретной структуры страницы.

Пишите свои предложения и замечания и занимайтесь программированием, хотя бы для поддержания уровня интеллекта.

Парсить это вам не лобио кушать
Парсить это вам не лобио кушать