BeautifulSoup

Как да анализирате XML файлове с помощта на Python BeautifulSoup

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

Има два основни аспекта на синтактичния анализ на XML файлове. Те са:

Ще трябва да намерите маркера, който съдържа информацията, която искате, след което да я извлечете. Ще научите как да правите и двете, когато работите с XML файлове преди края на тази статия.

Инсталация

BeautifulSoup е една от най-използваните библиотеки, когато става въпрос за уеб изстъргване с Python. Тъй като XML файловете са подобни на HTML файлове, той също може да ги анализира. За да анализирате XML файлове с помощта на BeautifulSoup, най-добре е да използвате Python lxml парсер.

Можете да инсталирате двете библиотеки с помощта на пип инструмент за инсталиране, чрез командата по-долу:

pip инсталирайте bs4 lxml

За да потвърдите, че и двете библиотеки са успешно инсталирани, можете да активирате интерактивната обвивка и да опитате да импортирате и двете. Ако не се появи грешка, значи сте готови да продължите с останалата част от статията.

Ето пример:

$ python
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
съдържание = []
# Прочетете XML файла
с отворен ("проба.xml "," r ") като файл:
# Прочетете всеки ред във файла, readlines () връща списък с редове
съдържание = файл.прочетени линии ()
# Комбинирайте редовете в списъка в низ
съдържание = "".присъединете се (съдържание)
bs_content = bs (съдържание, "lxml")

Кодовата извадка над вноса BeautifulSoup, след това чете XML файла като обикновен файл. След това той предава съдържанието в импортираното BeautifulSoup библиотека, както и парсер по избор.

Ще забележите, че кодът не се импортира lxml. Не е задължително като BeautifulSoup ще избере lxml парсер в резултат на преминаване „Lxml“ в обекта.

Сега можете да продължите с останалата част от статията.

Намиране на тагове

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

Можете да намерите тагове в XML документи чрез:

Намиране на тагове по имена

Има два метода BeautifulSoup, които можете да използвате при намиране на тагове по имена. Случаите на употреба обаче се различават; нека ги разгледаме.

намирам

От личен опит ще използвате намирам метод по-често от другите методи за намиране на тагове в тази статия. Маркерът за търсене получава името на маркера, който искате да получите, и връща обект BeautifulSoup на маркера, ако го намери; в противен случай се връща Нито един.

Ето пример:

>>> резултат = bs_content.намиране ("данни")
>>> печат (резултат)
Едно
>>> резултат = bs_content.намери ("уникален")
>>> печат (резултат)
Близнаци
>>> резултат = bs_content.намери ("баща")
>>> печат (резултат)
Нито един
>>> резултат = bs_content.намери ("майка")
>>> печат (резултат)
Нито един

Ако разгледате примера, ще видите, че намирам метод връща таг, ако съвпада с името, иначе връща None. Ако обаче го погледнете отблизо, ще видите, че връща само един таг.

Например кога намери („данни“) беше извикан, той върна само първия маркер с данни, но не върна останалите.

ХВАНАХ ТЕ: The намирам метод ще върне само първия таг, който съответства на заявката му.

И така, как да намерите и други тагове? Това ни води към следващия метод.

find_all

The find_all метод е доста подобен на намирам метод. Единствената разлика е, че връща списък с маркери, които съответстват на заявката му. Когато не намери маркер, той просто връща празен списък. Следователно, find_all винаги ще връща списък.

Ето пример:

>>> резултат = bs_content.find_all ("данни")
>>> печат (резултат)
[Едно, Две]
>>> резултат = bs_content.find_all ("дете")
>>> печат (резултат)
[Първо, Второ,
Трето

Едно
Две
Близнаци

, Четвърто]
>>> резултат = bs_content.find_all ("баща")
>>> печат (резултат
[]
>>> резултат = bs_content.find_all ("майка")
>>> печат (резултат)
[]

Сега, когато знаете как да използвате намирам и find_all методи, можете да търсите тагове навсякъде в XML документа. Можете обаче да направите търсенията си по-мощни.

Ето как:

Някои маркери могат да имат едно и също име, но различни атрибути. Например дете етикетите имат име атрибут и различни стойности. Можете да правите конкретни търсения въз основа на тях.

Погледнете това:

>>> резултат = bs_content.намери ("дете", "име": "Роза")
>>> печат (резултат)
Второ
>>> резултат = bs_content.find_all ("дете", "name": "Rose")
>>> печат (резултат)
[Второ]
>>> резултат = bs_content.намери ("дете", "име": "Джак")
>>> печат (резултат)
Първо
>>> резултат = bs_content.find_all ("дете", "name": "Jack")
>>> печат (резултат)
[Първо]

Ще видите, че има нещо различно в използването на намирам и find_all методи тук: и двамата имат втори параметър.

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

Например, въпреки че използвате намирам метод в първия пример, той върна втория дете таг (вместо първия дете таг), защото това е първият таг, който съответства на заявката. The find_all tag следва същия принцип, с изключение на това, че връща всички тагове, които съответстват на заявката, а не само първата.

Намиране на тагове по връзки

Макар и по-малко популярни от търсенето по имена на маркери, можете също да търсите етикети по връзки. В реалния смисъл обаче това е повече навигация, отколкото търсене.

Има три ключови връзки в XML документи:

От обяснението по-горе можете да заключите, че референтният маркер е най-важният фактор при търсенето на маркери по връзки. Следователно, нека да потърсим референтния маркер и да продължим статията.

Погледни това:

>>> third_child = bs_content.намери ("дете", "име": "Син бръшлян")
>>> печат (third_child)

Трето

Едно
Две
Близнаци

От примерния код по-горе, референтният маркер за останалата част от този раздел ще бъде третият дете етикет, съхраняван в third_child променлива. В подразделите по-долу ще видите как да търсите маркери въз основа на връзката между родител, брат и сестра и референтния маркер.

Намиране на родители

За да намерите родителския маркер на референтен маркер, ще използвате родител атрибут. Правейки това връща родителския маркер, както и маркерите под него. Това поведение е напълно разбираемо, тъй като детските тагове са част от родителския.

Ето пример:

>>> резултат = трето_ дете.родител
>>> печат (резултат)

Първо
Второ

Трето

Едно
Две
Близнаци


Четвърто

Намиране на деца

За да намерите дъщерните тагове на референтен маркер, ще използвате деца атрибут. По този начин се връщат дъщерните тагове, както и подмаркерите под всеки един от тях. Това поведение също е разбираемо, тъй като детските тагове често имат свои собствени детски тагове.

Едно нещо, което трябва да обърнете внимание е, че деца атрибут връща дъщерните тагове като генератор. Така че, ако имате нужда от списък с детските тагове, ще трябва да конвертирате генератора в списък.

Ето пример:

>>> резултат = списък (third_child.деца)
>>> печат (резултат)
['\ n Трето \ n',
Едно
Две
Близнаци
, '\н']

Ако разгледате отблизо примера по-горе, ще забележите, че някои стойности в списъка не са маркери. Това е нещо, за което трябва да внимавате.

ХВАНАХ ТЕ: The деца attribute не само връща дъщерните тагове, но също така връща текста в референтния таг.

Намиране на братя и сестри

Последното в този раздел е намирането на тагове, които са събратя на референтния маркер. За всеки референтен маркер може да има маркери за братя и сестри преди и след него. The предишни_братя и сестри attribute ще върне родствените маркери преди референтния таг и next_siblings attribute ще върне родствените маркери след него.

Точно като деца атрибут, предишни_братя и сестри и next_siblings атрибутите ще върнат генератори. Така че трябва да конвертирате в списък, ако имате нужда от списък с братя и сестри.

Погледни това:

>>> previous_siblings = списък (third_child.предишни_сестри)
>>> печат (предишни_братя и сестри)
['\н', Второ, '\н',
Първо, '\н']
>>> next_siblings = списък (third_child.next_siblings)
>>> печат (next_siblings)
['\н', Четвърто]
>>> печат (предишни_сиблинги + следващи_сиблинги)
['\н', Второ, '\н', Първо,
„\ n“, „\ n“, Четвърто, '\н']

Първият пример показва предишните братя и сестри, вторият показва следващите братя и сестри; след това и двата резултата се комбинират, за да се генерира списък на всички братя и сестри за референтния маркер.

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

При анализирането на XML документи голяма част от работата се крие в намирането на правилните тагове. Въпреки това, когато ги намерите, може да искате да извлечете определена информация от тези тагове и на това ще ви научи този раздел.

Ще видите как да извлечете следното:

Извличане на стойности на атрибути на маркери

Понякога може да имате причина да извлечете стойностите за атрибутите в етикет. В следното сдвояване атрибут-стойност например: name = ”Роза”, може да искате да извлечете „Роза.”

За да направите това, можете да използвате вземете метод или достъп до името на атрибута с помощта на [] като индекс, точно както при работа с речник.

Ето пример:

>>> резултат = трето_ дете.get ("име")
>>> печат (резултат)
Син бръшлян
>>> резултат = third_child ["name"]
>>> печат (резултат)
Син бръшлян

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

Когато искате да получите достъп до текстовите стойности на етикет, можете да използвате текст или струни атрибут. И двамата ще върнат текста в таг и дори детските тагове. както и да е текст attribute ще ги върне като единичен низ, обединени; докато струни attribute ще ги върне като генератор, който можете да конвертирате в списък.

Ето пример:

>>> резултат = трето_ дете.текст
>>> печат (резултат)
'\ n Трето \ n \ nЕдно \ nДве \ nДвойки \ n \ n'
>>> резултат = списък (third_child.струни)
>>> печат (резултат)
['\ n Трети \ n', '\ n', 'Един', '\ n', 'Два', '\ n', 'Близнаци', '\ n', '\ n']

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

Освен извличането на стойностите на атрибутите и текста на маркера, можете също да извлечете цялото съдържание на таговете. За да направите това, можете да използвате съдържание атрибут; тя е малко подобна на деца атрибут и ще даде същите резултати. Въпреки това, докато деца атрибутът връща генератор, съдържание атрибут връща списък.

Ето пример:

>>> резултат = трето_ дете.съдържание
>>> печат (резултат)
['\ n Трето \ n',
Едно
Две
Близнаци
, '\н']

Печат красив

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

Ето пример за нормален печат:

>>> печат (third_child)

Трето

Едно
Две
Близнаци

Можете обаче да подобрите външния му вид, като използвате разкрасявам метод. Просто се обадете на разкрасявам метод на етикета, докато печатате, и ще получите нещо визуално приятно.

Погледни това:

Заключение

Анализът на документи е важен аспект на източника на данни. XML документите са доста популярни и се надяваме, че сте по-добре подготвени да ги вземете и да извлечете данните, които искате.

От тази статия вече можете да:

Ако се чувствате доста изгубени и сте доста нови за библиотеката BeautifulSoup, можете да разгледате урока по BeautifulSoup за начинаещи.

Курсорът скача или се движи произволно, докато пишете в Windows 10
Ако установите, че курсорът на вашата мишка скача или се движи самостоятелно, автоматично, произволно, докато пишете в лаптоп или компютър на Windows,...
Как да обърнете посоката на превъртане на мишката и тъчпада в Windows 10
Мишка и Тъчпадs не само правят изчисленията лесни, но и по-ефективни и отнемат по-малко време. Не можем да си представим живот без тези устройства, но...
Как да промените курсора на мишката и размера на курсора, цвета и схемата в Windows 10
Показалецът на мишката и курсорът в Windows 10 са много важни аспекти на операционната система. Това може да се каже и за други операционни системи, т...