BeautifulSoup

Как анализировать XML-файлы с помощью Python BeautifulSoup

Как анализировать XML-файлы с помощью Python BeautifulSoup
Данные есть буквально везде, во всех видах документов. Но не все это полезно, поэтому необходимо проанализировать его, чтобы получить нужные части. XML-документы являются одними из таких документов, которые содержат данные. Они очень похожи на файлы HTML, поскольку имеют почти такую ​​же структуру. Следовательно, вам нужно будет проанализировать их, чтобы получить жизненно важную информацию, как и при работе с HTML.

Есть два основных аспекта синтаксического анализа файлов XML. Они есть:

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

Монтаж

BeautifulSoup - одна из наиболее часто используемых библиотек, когда дело доходит до парсинга веб-страниц с помощью Python. Поскольку файлы XML похожи на файлы HTML, он также может их анализировать. Однако для анализа XML-файлов с помощью BeautifulSoup лучше всего использовать Python lxml парсер.

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

pip install bs4 lxml

Чтобы убедиться, что обе библиотеки успешно установлены, вы можете активировать интерактивную оболочку и попробовать импортировать обе. Если ошибка не появляется, то можно приступить к остальной части статьи.

Вот пример:

$ питон
Python 3.7.4 (теги / v3.7.4: e09359112e, 8 июл 2019, 20:34:20)
[MSC v.1916 64 бит (AMD64)] на win32
Введите «помощь», «авторские права», «кредиты» или «лицензия» для получения дополнительной информации.
>>> импорт bs4
>>> импортировать lxml
>>>

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



Дерево

Первый
Второй

В третьих

Один
Два
Двойняшки


Четвертый

Теперь в вашем скрипте Python; вам нужно будет прочитать XML-файл как обычный файл, а затем передать его в BeautifulSoup. В оставшейся части этой статьи будет использоваться bs_content переменная, поэтому важно, чтобы вы сделали этот шаг.

# Импортировать BeautifulSoup
из bs4 импортировать BeautifulSoup как bs
content = []
# Прочитать XML-файл
с открытым ("образец.xml "," r ") как файл:
# Прочитать каждую строку в файле, readlines () вернет список строк
content = file.readlines ()
# Объединить строки в списке в строку
content = "".присоединиться (содержание)
bs_content = bs (контент, "lxml")

Пример кода выше импортирует BeautifulSoup, затем он читает XML-файл как обычный файл. После этого он передает контент в импортированный BeautifulSoup библиотека, а также выбранный парсер.

Вы заметите, что код не импортирует lxml. Это не обязательно, как BeautifulSoup выберут lxml парсер в результате передачи «Lxml» в объект.

Теперь вы можете перейти к остальной части статьи.

Поиск тегов

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

Вы можете найти теги в XML-документах:

Поиск тегов по именам

Есть два метода BeautifulSoup, которые вы можете использовать при поиске тегов по именам. Однако варианты использования различаются; давай посмотрим на них.

найти

Исходя из личного опыта, вы будете использовать найти метод чаще, чем другие методы поиска тегов в этой статье. Тег find получает имя тега, который вы хотите получить, и возвращает объект BeautifulSoup тега, если он его находит; иначе он возвращается Никто.

Вот пример:

>>> результат = bs_content.найти ("данные")
>>> print (результат)
Один
>>> результат = bs_content.find ("уникальный")
>>> print (результат)
Двойняшки
>>> результат = bs_content.найти ("отец")
>>> print (результат)
Никто
>>> результат = bs_content.найти ("мать")
>>> print (результат)
Никто

Если вы посмотрите на пример, вы увидите, что найти метод возвращает тег, если он соответствует имени, иначе он возвращает None. Однако, если вы внимательно посмотрите на него, вы увидите, что он возвращает только один тег.

Например, когда найти («данные») был вызван, он вернул только первый тег данных, но не вернул другие.

ПОПАЛСЯ: В найти метод вернет только первый тег, который соответствует его запросу.

Итак, как вам найти и другие теги? Это приводит нас к следующему методу.

найти все

В найти все метод очень похож на найти метод. Единственное отличие состоит в том, что он возвращает список тегов, соответствующих его запросу. Когда он не находит ни одного тега, он просто возвращает пустой список. Следовательно, найти все всегда будет возвращать список.

Вот пример:

>>> результат = bs_content.find_all ("данные")
>>> print (результат)
[Один, Два]
>>> результат = bs_content.find_all ("ребенок")
>>> print (результат)
[Первый, Второй,
В третьих

Один
Два
Двойняшки

, Четвертый]
>>> результат = bs_content.find_all ("отец")
>>> print (результат
[]
>>> результат = bs_content.find_all ("мать")
>>> print (результат)
[]

Теперь, когда вы знаете, как использовать найти а также найти все методы, вы можете искать теги в любом месте XML-документа. Однако вы можете сделать свои поисковые запросы более эффективными.

Вот как:

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

Посмотри на это:

>>> результат = bs_content.find ("ребенок", "имя": "Роза")
>>> print (результат)
Второй
>>> результат = bs_content.find_all ("ребенок", "имя": "Роза")
>>> print (результат)
[Второй]
>>> результат = bs_content.find ("ребенок", "имя": "Джек")
>>> print (результат)
Первый
>>> результат = bs_content.find_all ("ребенок", "имя": "Джек")
>>> print (результат)
[Первый]

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

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

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

Поиск тегов по отношениям

Хотя поиск по тегам менее популярен, чем поиск по именам, вы также можете искать теги по отношениям. На самом деле это скорее навигация, чем поиск.

В XML-документах есть три ключевых отношения:

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

Взгляните на это:

>>> third_child = bs_content.find ("ребенок", "имя": "Голубой плющ")
>>> print (третий_ ребенок)

В третьих

Один
Два
Двойняшки

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

В поисках родителей

Чтобы найти родительский тег ссылочного тега, вы воспользуетесь родитель атрибут. Это возвращает родительский тег, а также теги под ним. Такое поведение вполне понятно, поскольку дочерние теги являются частью родительского тега.

Вот пример:

>>> результат = третий_ ребенок.родитель
>>> print (результат)

Первый
Второй

В третьих

Один
Два
Двойняшки


Четвертый

В поисках детей

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

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

Вот пример:

>>> результат = список (третий_деток.дети)
>>> print (результат)
['\ n Третий \ n',
Один
Два
Двойняшки
, '\ n']

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

ПОПАЛСЯ: В дети Атрибут не только возвращает дочерние теги, но также возвращает текст в ссылочном теге.

Поиск братьев и сестер

Последний в этом разделе - поиск тегов, которые являются родственниками тега ссылки. Для каждого ссылочного тега могут быть одноуровневые теги до и после него. В previous_siblings Атрибут вернет одноуровневые теги перед ссылочным тегом, а next_siblings Атрибут вернет родственные теги после него.

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

Взгляните на это:

>>> previous_siblings = список (третий_деток.previous_siblings)
>>> печать (предыдущие_сиблинги)
['\ n', Второй, '\ n',
Первый, '\ n']
>>> next_siblings = список (третий_ ребенок.next_siblings)
>>> print (next_siblings)
['\ n', Четвертый]
>>> печать (предыдущие_сиблинги + следующие_сиблинги)
['\ n', Второй, '\ n', Первый,
'\ n', '\ n', Четвертый, '\ n']

Первый пример показывает предыдущих братьев и сестер, второй - следующих братьев и сестер; затем оба результата объединяются для создания списка всех братьев и сестер для ссылочного тега.

Извлечение из тегов

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

Вы увидите, как извлечь следующее:

Извлечение значений атрибутов тегов

Иногда у вас может быть причина извлечь значения атрибутов в теге. Например, в следующей паре атрибут-значение: name = "Роза", вы можете извлечь «Роза.”

Для этого вы можете использовать получать метод или доступ к имени атрибута с помощью [] как индекс, как и при работе со словарем.

Вот пример:

>>> результат = третий_ ребенок.получить ("имя")
>>> print (результат)
Синий плющ
>>> result = third_child ["имя"]
>>> print (результат)
Синий плющ

Извлечение текста тега

Если вы хотите получить доступ к текстовым значениям тега, вы можете использовать текст или же струны атрибут. Оба вернут текст в теге и даже дочерние теги. Тем не менее текст Атрибут вернет их как одну объединенную строку; в то время как струны атрибут вернет их как генератор, который вы можете преобразовать в список.

Вот пример:

>>> результат = третий_ ребенок.текст
>>> print (результат)
'\ n Третий \ n \ nОдин \ nДва \ nДва \ n \ n'
>>> результат = список (третий_деток.струны)
>>> print (результат)
['\ n Третий \ n', '\ n', 'Один', '\ n', 'Два', '\ n', 'Близнецы', '\ n', '\ n']

Извлечение содержимого тега

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

Вот пример:

>>> результат = третий_ ребенок.содержание
>>> print (результат)
['\ n Третий \ n',
Один
Два
Двойняшки
, '\ n']

Красивая печать

До сих пор вы видели некоторые важные методы и атрибуты, которые полезны при синтаксическом анализе XML-документов с помощью BeautifulSoup. Но если вы заметили, когда вы печатаете теги на экране, они имеют какой-то кластерный вид. Хотя внешний вид может не иметь прямого влияния на вашу продуктивность, он может помочь вам более эффективно анализировать и сделать работу менее утомительной.

Вот пример обычной печати:

>>> print (третий_ ребенок)

В третьих

Один
Два
Двойняшки

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

Взгляните на это:

Заключение

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

Из этой статьи вы теперь можете:

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

Vulkan для пользователей Linux
С каждым новым поколением видеокарт мы видим, как разработчики игр расширяют границы графической точности и приближаются на шаг ближе к фотореализму. ...
OpenTTD против Simutrans
Создание собственного транспортного симулятора может быть увлекательным, расслабляющим и чрезвычайно увлекательным занятием. Вот почему вам нужно попр...
Учебник OpenTTD
OpenTTD - одна из самых популярных бизнес-симуляторов. В этой игре вам нужно создать замечательный транспортный бизнес. Тем не менее, вы начнете в нач...