Как открыть html файл python

Обновлено: 21.11.2024

Учебное пособие по Python BeautifulSoup — это вводное руководство по библиотеке BeautifulSoup Python. В примерах выполняется поиск тегов, просмотр дерева документов, изменение документа и сбор веб-страниц.

Красивый суп

BeautifulSoup – это библиотека Python для анализа документов HTML и XML. Часто используется для веб-скрейпинга. BeautifulSoup преобразует сложный документ HTML в сложное дерево объектов Python, таких как тег, строка навигации или комментарий.

Установка BeautifulSoup

Мы используем команду pip3 для установки необходимых модулей.

Нам нужно установить модуль lxml, который используется BeautifulSoup.

BeautifulSoup устанавливается с помощью приведенной выше команды.

Файл HTML

В примерах мы будем использовать следующий файл HTML:

Простой пример Python BeautifulSoup

В первом примере мы используем модуль BeautifulSoup для получения трех тегов.

В примере кода печатается HTML-код из трех тегов.

Мы импортируем класс BeautifulSoup из модуля bs4. BeautifulSoup — это основной класс для выполнения работы.

Мы открываем файл index.html и читаем его содержимое с помощью метода read.

Создается объект BeautifulSoup; данные HTML передаются конструктору. Второй параметр указывает парсер.

Здесь мы печатаем HTML-код двух тегов: h2 и head .

Есть несколько элементов li; строка печатает первую.

Теги BeautifulSoup, название, текст

Атрибут name тега задает его имя, а атрибут text — его текстовое содержимое.

В примере кода печатается HTML-код, имя и текст тега h2.

Теги обхода BeautifulSoup

С помощью метода recursiveChildGenerator мы просматриваем документ HTML.

Пример просматривает дерево документа и печатает имена всех тегов HTML.

В документе HTML у нас есть эти теги.

Дочерние элементы BeautifulSoup

С помощью атрибута children мы можем получить дочерние элементы тега.

В примере извлекаются дочерние элементы тега html, помещаются в список Python и выводятся на консоль. Поскольку атрибут children также возвращает пробелы между тегами, мы добавляем условие, чтобы включать только имена тегов.

Теги html имеют двух дочерних элементов: head и body .

Потомки элемента BeautifulSoup

С атрибутом потомки мы получаем всех потомков (дочерних элементов всех уровней) тега.

В этом примере извлекаются все потомки тега body.

Это все потомки тега body.

Очистка веб-страниц BeautifulSoup

В примере извлекается заголовок простой веб-страницы. Он также печатает своего родителя.

Мы получаем HTML-данные страницы.

Мы извлекаем HTML-код заголовка, его текст и HTML-код родителя.

Код красивого оформления BeautifulSoup

С помощью метода prettify мы можем улучшить внешний вид HTML-кода.

Мы украшаем HTML-код простой веб-страницы.

Парсинг BeautifulSoup со встроенным веб-сервером

Мы создаем публичный каталог и копируем туда index.html.

Теперь мы получаем документ с локально работающего сервера.

BeautifulSoup находит элементы по идентификатору

С помощью метода find мы можем находить элементы различными способами, включая идентификатор элемента.

В примере кода найден тег ul с идентификатором mylist. Строка с комментариями — это альтернативный способ выполнения той же задачи.

BeautifulSoup находит все теги

С помощью метода find_all мы можем найти все элементы, соответствующие некоторым критериям.

Пример кода находит и печатает все теги li.

Метод find_all может принимать список элементов для поиска.

В примере находят все элементы h2 и p и печатают их текст.

Метод find_all также может принимать функцию, которая определяет, какие элементы должны быть возвращены.

В примере печатаются пустые элементы.

Единственным пустым элементом в документе является meta .

Также можно находить элементы с помощью регулярных выражений.

В этом примере выводится содержимое элементов, содержащих строку 'BSD'.

Селекторы CSS BeautifulSoup

С помощью методов select и select_one мы можем использовать некоторые селекторы CSS для поиска элементов.

В этом примере используется селектор CSS для печати HTML-кода третьего элемента li.

Это третий элемент li.

В примере выводится элемент с идентификатором mylist.

Добавить элемент BeautifulSoup

Метод append добавляет новый тег в документ HTML.

В этом примере добавляется новый тег li.

Сначала мы создаем новый тег с помощью метода new_tag.

Мы получаем ссылку на тег ul.

Мы добавляем только что созданный тег к тегу ul.

Мы печатаем тег ul в аккуратном формате.

Вставить элемент BeautifulSoup

Метод вставки вставляет тег в указанное место.

В этом примере тег li вставляется в третью позицию тега ul.

BeautifulSoup заменить текст

replace_with заменяет текст элемента.

В примере выполняется поиск определенного элемента с помощью метода find и замена его содержимого методом replace_with.

Этот модуль определяет класс HTMLParser, который служит основой для анализа текстовых файлов, отформатированных в HTML (язык гипертекстовой разметки) и XHTML.

класс html.parser. HTMLParser ( * , convert_charrefs = True ) ¶

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

Если для параметра convert_charrefs задано значение True (по умолчанию), все ссылки на символы (кроме ссылок в элементах скрипта/стиля) автоматически преобразуются в соответствующие символы Юникода.

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

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

Изменено в версии 3.4: добавлен аргумент ключевого слова convert_charrefs.

Изменено в версии 3.5: значением по умолчанию для аргумента convert_charrefs теперь является True .

Пример приложения парсера HTML¶

В качестве базового примера ниже приведен простой анализатор HTML, который использует класс HTMLParser для вывода начальных тегов, конечных тегов и данных по мере их обнаружения:

Вывод будет таким:

Методы HTMLParser¶

Экземпляры HTMLParser имеют следующие методы:

HTMLПарсер. фид ( данные ) ¶

Отправьте текст парсеру. Он обрабатывается, поскольку состоит из полных элементов; неполные данные буферизуются до тех пор, пока не будут переданы дополнительные данные или не будет вызван метод close(). данные должны быть str .

Принудительная обработка всех буферизованных данных, как если бы за ними следовала метка конца файла. Этот метод может быть переопределен производным классом для определения дополнительной обработки в конце ввода, но переопределенная версия всегда должна вызывать метод close() базового класса HTMLParser .

Сбросить экземпляр. Теряет все необработанные данные. Это вызывается неявно во время создания экземпляра.

Возвращает текущий номер строки и смещение.

Возвращает текст последнего открытого начального тега. Обычно это не требуется для структурированной обработки, но может быть полезно при работе с HTML «как развернуто» или для повторной генерации ввода с минимальными изменениями (можно сохранить пробелы между атрибутами и т. д.).

Следующие методы вызываются, когда встречаются данные или элементы разметки, и они предназначены для переопределения в подклассе. Реализации базового класса ничего не делают (кроме handle_startendtag() ):

HTMLПарсер. handle_starttag ( тег , аттры ) ¶

Этот метод вызывается для обработки начального тега элемента (например,

Аргумент тег – это имя тега, преобразованное в нижний регистр. Аргумент attrs представляет собой список пар (имя, значение), содержащих атрибуты, находящиеся внутри скобок <> тега. имя будет переведено в нижний регистр, а кавычки в значении удалены, а ссылки на символы и объекты заменены.

Все ссылки на объекты из html.entities заменяются в значениях атрибутов.

HTMLПарсер. handle_endtag ( тег ) ¶

Этот метод вызывается для обработки конечного тега элемента (например,

Аргумент тег — это имя тега, преобразованное в нижний регистр.

HTMLПарсер. handle_startendtag ( тег , аттры ) ¶

Аналогичен handle_starttag() , но вызывается, когда анализатор встречает пустой тег в стиле XHTML ( . /> ). Этот метод может быть переопределен подклассами, которым требуется эта конкретная лексическая информация; реализация по умолчанию просто вызывает handle_starttag() и handle_endtag() .

HTMLПарсер. handle_data ( данные ) ¶

Этот метод вызывается для обработки произвольных данных (например, текстовых узлов и содержимого элементов и ).

HTMLПарсер. handle_entityref ( имя ) ¶

Этот метод вызывается для обработки ссылки на именованный символ в форме &name; (например, > ), где name – это общая ссылка на объект (например, 'gt' ). Этот метод никогда не вызывается, если convert_charrefs имеет значение True .

HTMLПарсер. handle_charref ( имя ) ¶

HTMLПарсер. handle_comment ( данные ) ¶

Этот метод вызывается при обнаружении комментария (например, ).

Например, комментарий comment --> вызовет этот метод с аргументом ' comment ' .

Содержимое условных комментариев Internet Explorer (condcoms) также будет отправлено этому методу, поэтому для IE 9]>контента, специфичного для IE9, этот метод будет получать '[if IE 9]>контент, специфичный для IE9 .< /p>

HTMLПарсер.handle_decl ( decl ) ¶

Этот метод вызывается для обработки объявления типа документа HTML (например, html> ).

Параметр decl будет содержать все содержимое объявления внутри разметки (например, 'DOCTYPE html' ).

HTMLПарсер. handle_pi ( данные ) ¶

Метод вызывается при обнаружении инструкции обработки. Параметр data будет содержать полную инструкцию обработки. Например, для инструкции обработки color='red'> этот метод будет вызываться как handle_pi("proc color='red'") . Он предназначен для переопределения производным классом; реализация базового класса ничего не делает.

Класс HTMLParser использует синтаксические правила SGML для обработки инструкций. Инструкция обработки XHTML с завершающим знаком '?' вызовет '?' для включения в данные.

Этот метод вызывается, когда синтаксический анализатор считывает нераспознанное объявление.

Параметр data будет полным содержимым объявления внутри разметки. Иногда полезно быть переопределенным производным классом. Реализация базового класса ничего не делает.

Примеры¶

Следующий класс реализует синтаксический анализатор, который будет использоваться для иллюстрации дополнительных примеров:

Разбор типа документа:

Разбор элемента с несколькими атрибутами и заголовком:

Содержимое элементов сценария и стиля возвращается как есть, без дальнейшего синтаксического анализа:

Анализ именованных и числовых ссылок на символы и преобразование их в правильный char (примечание: все эти 3 ссылки эквивалентны '>' ):

Передача неполных фрагментов в функцию feed() работает, но handle_data() может вызываться более одного раза (если только для параметра convert_charrefs не задано значение True ):

Небольшое количество сценариев может упростить очистку документации и других больших наборов HTML-файлов. Но сначала вам нужно их проанализировать.

Как давний член группы документации в Scribus, я всегда в курсе последних обновлений исходного кода, поэтому я могу помочь внести обновления и дополнения в документацию. Когда я недавно делал «проверку» с помощью Subversion на компьютере, который я только что обновил до Fedora 27, я был поражен тем, сколько времени ушло на загрузку документации, которая состоит из HTML-страниц и связанных изображений. Я был обеспокоен тем, что документация проекта казалась намного больше, чем должна быть, и подозревал, что часть содержимого была документацией «зомби» — HTML-файлы, которые больше не используются, и изображения, которые потеряли все ссылки в используемом в настоящее время HTML.

Я решил создать для себя проект, чтобы разобраться в этом. Один из способов сделать это — найти существующие файлы изображений, которые не используются. Если бы я мог просмотреть все HTML-файлы в поисках ссылок на изображения, а затем сравнить этот список с фактическими файлами изображений, скорее всего, я увидел бы несоответствие.

Вот типичный тег изображения:

Меня интересует часть между первым набором кавычек после src= . После некоторого поиска решения я нашел модуль Python под названием BeautifulSoup. Вкусная часть сценария, которую я написал, выглядит так:

Мы можем использовать этот метод findAll для извлечения тегов изображения. Вот небольшой фрагмент вывода:

Пока все хорошо. Я подумал, что следующим шагом может быть просто сокращение этого, но когда я пробовал некоторые строковые методы в сценарии, он возвращал ошибки о том, что это теги, а не строки. Я сохранил вывод в файл и прошел процесс редактирования в KWrite. Одна приятная особенность KWrite заключается в том, что вы можете выполнять «найти и заменить» с помощью регулярных выражений (регулярных выражений), поэтому я мог заменить на \n, что облегчило понимание того, как вырезать это оттуда. Еще одна приятная особенность KWrite заключается в том, что если вы сделаете неразумный выбор с помощью регулярного выражения, его можно будет отменить.

Но я подумал, что наверняка есть что-то лучше этого, поэтому я обратился к регулярному выражению, а точнее к модулю re для Python. Соответствующая часть этого нового скрипта выглядит так:

И небольшая часть его вывода выглядит так:

На первый взгляд, он похож на приведенный выше вывод и имеет приятную функцию обрезки частей тега изображения, но есть загадочные включения тегов таблицы и другого контента. Я думаю, что это связано с этим регулярным выражением src (.*)", которое на самом деле было не лучше. Не будучи regexpert (только что это придумал), мои поиски различных идей по улучшению этого не помогли. помощь.

После ряда других вещей, даже опробовав HTML::Parser с Perl, я, наконец, попытался сравнить это с ситуацией некоторых скриптов, которые я написал для Scribus, которые анализируют содержимое текстового фрейма, символ за символом, то примите какие-нибудь меры. Для моих целей то, что я, наконец, придумал, улучшает все эти методы и вообще не требует регулярного выражения или парсера HTML.Вернемся к тому примеру тега img, который я показал.

Я решил сосредоточиться на фрагменте src=. Одним из способов было бы дождаться вхождения s , а затем посмотреть, является ли следующий символ r , следующим c и следующим = . Если да, то бинго! Тогда то, что следует между двумя наборами двойных кавычек, — это то, что мне нужно. Проблема заключается в структуре, необходимой для того, чтобы зацепиться за них. Один из способов взглянуть на строку символов, представляющую строку текста HTML, может быть следующим:

Но логика была слишком запутанной, чтобы цепляться за предыдущий c , за предыдущий, за тот и за другой.

В конце концов я решил сосредоточиться на знаке = и использовать метод индексации, с помощью которого я мог легко ссылаться на любой предшествующий или будущий символ в строке. Вот часть поиска:

Я начинаю поиск с четвертого символа (индексация начинается с 0), поэтому я не получаю ошибку индексации внизу, и в действительности перед четвертым символом строки не будет знака равенства. Первый тест состоит в том, чтобы увидеть, находим ли мы =, когда идем по строке, и если нет, то идем дальше. Если мы видим один, то мы спрашиваем, были ли три предыдущих символа s, r и c в этом порядке. Если это произойдет, мы вызовем функцию imagefound :

Мы отправляем функции текущий индекс, который представляет = . Мы знаем, что следующим символом будет " , поэтому мы пропускаем два символа и начинаем добавлять символы в удерживающую строку с именем newimage, пока не достигнем следующего " , и на этом мы закончили. Мы добавляем строку плюс символ новой строки в наш список imagelist и возвращаем значение, помня, что в этой оставшейся строке HTML может быть больше тегов изображений, поэтому мы вернулись в середину нашего цикла поиска.

Вот как теперь выглядит наш вывод:

Аааа, намного чище, и это заняло всего несколько секунд. Я мог бы перепрыгнуть еще семь индексных точек, чтобы вырезать изображения/часть, но мне нравится, когда они там, чтобы убедиться, что я не отрезал первую букву имени файла изображения, и это так легко редактировать с помощью KWrite — вам даже не нужно регулярное выражение. После этого и сохранения файла следующим шагом был запуск другого написанного мной скрипта под названием sortlist.py:

Это извлекает содержимое файла в виде списка, сортирует его, а затем сохраняет как другой файл. После этого я мог просто сделать следующее:

Затем мне нужно запустить sortlist.py и для этого файла, так как метод, который ls использует для сортировки, отличается от Python. Я мог бы запустить скрипт сравнения этих файлов, но предпочел сделать это визуально. В итоге я получил 42 изображения, на которые не было HTML-ссылки из документации.

Вот мой скрипт парсинга целиком:

Его название, parseimg4.py, на самом деле не отражает количество сценариев, которые я написал за это время, с незначительными и значительными переписываниями, а также с отбрасыванием и запуском заново. Обратите внимание, что я жестко запрограммировал эти каталоги и имена файлов, но их было бы достаточно легко обобщить, запросив ввод данных пользователем. Кроме того, поскольку это были рабочие сценарии, я отправил вывод в /tmp , чтобы они исчезли после перезагрузки системы.

На этом история не закончилась, так как следующим вопросом был: А как насчет HTML-файлов-зомби? Любой из этих файлов, который не используется, может ссылаться на изображения, не полученные предыдущим методом. У нас есть файл menu.xml, который служит оглавлением для онлайн-руководства, но мне также нужно было учесть, что некоторые файлы, перечисленные в оглавлении, могут ссылаться на файлы, которых нет в оглавлении, и да, я нашел некоторые из них.

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

В этой статье я покажу, как создавать, открывать и редактировать файлы HTML в TextEdit.

Что такое TextEdit?

TextEdit — это бесплатный текстовый процессор, предустановленный на вашем компьютере Mac. Он существует уже более 25 лет, и это простой способ открывать и читать текстовые файлы, текстовые файлы и даже файлы HTML.

Как создать файл HTML в TextEdit

<р>2. Нажмите «Формат» и нажмите «Сделать обычным текстом».

<р>3. Добавьте в файл базовый шаблон HTML.

<р>4. Выберите «Файл» > «Сохранить».

<р>5. Назовите файл с расширением .html. Это сообщит компьютеру, что он работает с файлом HTML. Нажмите Сохранить.

<р>6. Нажмите «Использовать .html».

Перейдите к этому вновь созданному файлу на своем компьютере и дважды щелкните его, чтобы открыть в браузере. Вы должны увидеть этот результат:

Как открывать документы HTML в TextEdit

Есть два способа открыть файл HTML в TextEdit.

Вариант 1

Перейдите к HTML-файлу, который хотите открыть, щелкните файл правой кнопкой мыши и выберите TextEdit, чтобы открыть его.

Вариант 2

Откройте TextEdit и нажмите «Файл» > «Открыть». Вы также можете навести указатель мыши на параметр «Открыть последние», если вы недавно открывали этот файл.

Режим редактирования кода TextEdit

В TextEdit есть возможность всегда отображать HTML-файлы в виде HTML-кода.

<р>2. Нажмите «Открыть и сохранить»:

<р>3. Установите флажок Отображать HTML-файлы как HTML-код вместо форматированного текста:

Теперь вы можете вносить изменения в HTML-файл и просматривать результаты в браузере.

Именно так вы создаете, сохраняете, открываете и редактируете файлы HTML в TextEdit.

Я музыкант и программист.

Если вы дочитали до этого места, отправьте твит автору, чтобы показать, что вам не все равно. Твитнуть спасибо

Научитесь программировать бесплатно. Учебная программа freeCodeCamp с открытым исходным кодом помогла более чем 40 000 человек получить работу в качестве разработчиков. Начать

freeCodeCamp – это поддерживаемая донорами некоммерческая организация, освобожденная от налогов в соответствии со статьей 501(c)(3) (идентификационный номер федерального налогоплательщика США: 82-0779546)

Наша миссия: помочь людям научиться программировать бесплатно. Мы достигаем этого, создавая тысячи видеороликов, статей и интерактивных уроков по кодированию — все они находятся в свободном доступе. У нас также есть тысячи учебных групп freeCodeCamp по всему миру.

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

Читайте также: