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

Python XML Parser.

Когда-нибудь застрял с раздражающим XML-файлом, который вам нужно разбираться, чтобы получить важные значения? Давайте узнаем, как создать Python XML Parser.

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

Когда-нибудь застрял с раздражающим XML-файлом, который вам нужно разбираться, чтобы получить важные значения? Давайте узнаем, как создать Python XML Parser.


    

Мы посмотрим, как мы можем анализировать файлы XML, используя Python, чтобы получить соответствующие атрибуты и значения.

Давайте начнем!

Способ 1: Использование ElementTree (рекомендуется)

Мы можем использовать ElementTree Библиотека Python для достижения этой задачи.

Это самый простой и рекомендуемый вариант для создания Python XML-анализатора, так как эта библиотека поступает в комплекте с Python по умолчанию Отказ

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


    

Мы будем использовать xml.etree.elementtree Интерфейс внутри сердечника XML упаковка.

import xml.etree.ElementTree as ET

Постройте дерево Python XML Parser

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

К счастью, для нас этот API уже имеет следующий метод для нас:

import xml.etree.ElementTree as ET
root_node = ET.parse('sample.xml').getroot()
print(root_node)

Это автоматически прочитает файл ввода XML и получает узел корневого узла.

Выход


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

Получите значения соответствующих атрибутов

Так что теперь наша задача – получить значение внутри <заголовок> Атрибут, с использованием нашего Python XML-парсера.

Его положение из корневого узла <Страница> это <Заголовок/Тип> Поэтому нам нужно петить через все матчи на этом уровне дерева.

Мы можем сделать это, используя root_node.findall (уровень) , где Уровень является желаемой позицией (

в нашем случае).

for tag in root_node.find_all(level):
    value = tag.get(attribute)
    if value is not None: print(value)

tag.get (атрибут) получит ценность нашего <Атрибут> Тег на уровнях, которые мы ищем. Итак, нам просто нужно сделать это в <Заголовок/Тип> и получите значения <заголовок> и <Текст> атрибуты. Это оно!

import xml.etree.ElementTree as ET

# We're at the root node ()
root_node = ET.parse('sample.xml').getroot()

# We need to go one level below to get 
# and then one more level from that to go to for tag in root_node.findall('header/type'): # Get the value of the heading attribute h_value = tag.get('heading') if h_value is not None: print(h_value) # Get the value of the text attribute t_value = tag.get('text') if t_value is not None: print(t_value)

Выход

XML Parsing in Python
Hello from AskPython. We'll be parsing XML

Мы получили все значения на этом уровне нашего разбора XML! Мы успешно проанализировали наш XML-файл.

Давайте возьмем еще один пример, чтобы убрать все.

Теперь предположим, что файл XML выглядит так:


    
        10
        20
        30
        40
    

Здесь мы должны не только получить значения атрибута Имя Но также получают текстовые значения 10, 20, 30 и 40 для каждого элемента на этом уровне.

Чтобы получить значение атрибута Имя мы можем сделать то же самое, что и раньше. Мы также можем использовать tag.attrib [name] получить значение. Это так же, как tag.get (имя) За исключением того, что он использует словарные поиски.

attr_value = tag.get(attr_name)
# Both methods are the same. You can
# choose any approach
attr_value = tag.attrib[attr_name]

Чтобы получить текстовое значение, это просто! Просто получите его, используя:

tag.text

Итак, наша полная программа для этого парсера будет:

import xml.etree.ElementTree as ET

# We're at the root node ()
root_node = ET.parse('sample.xml').getroot()

# We need to go one level below to get 
# and then one more level from that to go to 
for tag in root_node.findall('items/item'):
    # Get the value from the attribute 'name'
    value = tag.attrib['name']
    print(value)
    # Get the text of that tag
    print(tag.text)

Выход

item1
10
item2
20
item3
30
item4
40

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

Но я уйду это для вас, чтобы выяснить из Документация , поскольку я предоставил отправную точку для вас, чтобы построить!

Способ 2: Использование BeautifulSoup (надежна)

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

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

Чтобы установить его, используйте Пип и установить BS4 модуль:

pip3 install bs4

Я дам вам небольшой фрагмент для нашего предыдущего XML-файла:


    
        10
        20
        30
        40
    

Я передам этот файл, а затем разбирая его, используя BS4 Отказ

from bs4 import BeautifulSoup

fd = open('sample.xml', 'r')

xml_file = fd.read()

soup = BeautifulSoup(xml_file, 'lxml')

for tag in soup.findAll("item"):
    # print(tag)
    print(tag["name"])
    print(tag.text)

fd.close()

Синтаксис похож на наши XML Модуль, поэтому мы все еще получаем имена атрибутов, используя значение ['attribute_name'] и Text.Text Отказ Точно так же, как раньше!

Выход

item1
10
item2
20
item3
30
item4
40

Мы сейчас проанализировали это, используя BS4 тоже! Если ваш источник XML Файл плохо отформатирован, этот метод – это путь, поскольку BeautificSoup имеет разные правила для обработки таких файлов.

Заключение

Надеемся, что у вас есть хороший понять, как построить Python XML-парсер легко. Мы показали вам два подхода: один, использующий XML модуль, а другой, использующий Beautifulsoup Отказ

Рекомендации