Рубрики
Без рубрики

Синтаксический анализатор HTML в Python 3.x

html.парсер.HTML-парсер предоставляет очень простой и эффективный способ для кодеров читать HTML-код. Эта библиотека поставляется предварительно установленной в stdlib. Этот

Автор оригинала: Pankaj Kumar.

html.парсер.HTML Parser предоставляет очень простой и эффективный способ для кодеров читать HTML-код. Эта библиотека поставляется предварительно установленной в stdlib . Это упрощает наше взаимодействие с библиотекой HTMLParser, так как нам не нужно устанавливать дополнительные пакеты из индекса пакетов Python (PyPI) для той же задачи.

Что такое HTML-парсер?

По сути, HTMLParser позволяет нам понимать HTML-код вложенным образом. Модуль имеет методы, которые автоматически вызываются при встрече с определенными элементами HTML. Это упрощает HTML-теги и идентификацию данных.

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

Как использовать HTML-парсер?

HTMLParser только идентифицирует теги или данные для нас, но не выводит никаких данных, когда что-то идентифицировано. Нам нужно добавить функциональность к методам, прежде чем они смогут выводить найденную информацию.

Но если нам нужно добавить функциональность, какой смысл в парсере HTML? Этот модуль экономит нам время на создание функциональности идентификации тегов самих себя.

Мы не будем кодировать, как идентифицировать теги, только то, что делать, как только они будут идентифицированы.

Понял? Отлично! Теперь давайте займемся созданием парсера для себя!

Подкласс синтаксического анализатора HTML

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

Подклассы позволяют нам переопределить функциональность метода по умолчанию (которая в нашем случае ничего не возвращает при идентификации тегов) и вместо этого добавить некоторые лучшие функции. Давайте посмотрим, как теперь работать с HTML-парсером.

Поиск имен вызываемых методов

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

  • HTMLParser. handle_starttag(tag, attrs) – Вызывается при обнаружении начальных тегов (пример , , )
  • HTMLParser. handle_endtag(тег) – Вызывается при обнаружении конечных тегов (пример , , )
  • HTMLParser. handle_data(data) – Вызывается при обнаружении данных (пример href =#> data ) href =#>
  • data ) HTMLParser. handle_comment(данные)
  • – Вызывается при обнаружении комментариев (пример комментарий–>) комментарий–>) HTMLParser. handle_decl(decl) – Вызывается при обнаружении объявлений

Создание Парсера HTML

Давайте определим основные функции печати для методов в модуле HTMLParser. В приведенном ниже примере все, что я делаю, – это добавляю метод печати всякий раз, когда вызывается этот метод.

Последняя строка в коде-это место, где мы передаем данные синтаксическому анализатору. Я напрямую ввел базовый HTML-код, но вы можете сделать то же самое, используя модуль urllib для прямого импорта веб-сайта в python .

from html.parser import HTMLParser

class Parse(HTMLParser):
    def __init__(self):
    #Since Python 3, we need to call the __init__() function 
    #of the parent class
        super().__init__()
        self.reset()

    #Defining what the methods should output when called by HTMLParser.
    def handle_starttag(self, tag, attrs):
        print("Start tag: ", tag)
        for a in attrs:
            print("Attributes of the tag: ", a)

    def handle_data(self, data):
        print("Here's the data: ", data)

    def handle_endtag(self, tag):
        print("End tag: ", tag)


testParser = Parse()
testParser.feed("Testing Parser")
Вывод HTML-парсера

Для Чего Можно Использовать HTMLParser?

Очистка веб-данных.

Это то, для чего большинству людей понадобится модуль HTMLParser. Не говоря уже о том, что он не может быть использован ни для чего другого, но когда вам нужно прочитать множество веб-сайтов и найти конкретную информацию, этот модуль сделает эту задачу легкой прогулкой для вас.

Пример реального мира HTMLParser

Я собираюсь вытащить каждую ссылку со страницы Википедии Python для этого примера.

Это можно сделать вручную, щелкнув правой кнопкой мыши по ссылке, скопировав и вставив ее в файл Word, а затем перейдя к следующему. Но это займет несколько часов, если на странице будет много ссылок, что является типичной ситуацией со страницами Википедии.

Но мы потратим 5 минут на кодирование HTML-парсера и получим время, необходимое для выполнения задачи, от нескольких часов до нескольких секунд. Давайте сделаем это!

from html.parser import HTMLParser
import urllib.request

#Import HTML from a URL
url = urllib.request.urlopen("https://en.wikipedia.org/wiki/Python_(programming_language)")
html = url.read().decode()
url.close()

class Parse(HTMLParser):
    def __init__(self):
    #Since Python 3, we need to call the __init__() function of the parent class
        super().__init__()
        self.reset()
    #Defining what the method should output when called by HTMLParser.
    def handle_starttag(self, tag, attrs):
        # Only parse the 'anchor' tag.
        if tag == "a":
           for name,link in attrs:
               if name == "href" and link.startswith("http"):
                   print (link)

p = Parse()
p.feed(html)
Веб-скребок Python HTMLParser

Страница программирования на Python в Википедии содержит более 300 ссылок. Я уверен, что мне потребовалось бы не меньше часа, чтобы убедиться, что у нас есть все. Но с помощью этого простого скрипта потребовалось менее 5 секунд, чтобы вывести каждую ссылку, не пропуская ни одной из них!

Вывод

С этим модулем действительно интересно играть. В итоге мы собрали тонны данных из Интернета, используя этот простой модуль в процессе написания этого учебника.

Теперь есть другие модули, такие как BeautifulSoup , которые более известны. Но для быстрых и простых задач HTML-парсер делает действительно потрясающую работу!