БеаутифулСоуп

Како рашчланити КСМЛ датотеке помоћу Питхон-ове БеаутифулСоуп

Како рашчланити КСМЛ датотеке помоћу Питхон-ове БеаутифулСоуп
Подаци су буквално свуда, у свим врстама докумената. Али није све корисно, па отуда и потреба да се рашчлани како би се добили потребни делови. КСМЛ документи су један од таквих докумената који садрже податке. Они су врло слични ХТМЛ датотекама, јер имају скоро исту структуру. Стога ћете их морати рашчланити да бисте добили виталне информације, баш као што бисте то урадили и када радите са ХТМЛ-ом.

Постоје два главна аспекта рашчлањивања КСМЛ датотека. Су:

Мораћете да пронађете ознаку која садржи информације које желите, а затим их извадите. Научићете како се то ради приликом рада са КСМЛ датотекама пре краја овог чланка.

Инсталација

БеаутифулСоуп је једна од најчешће коришћених библиотека када је у питању стругање Веба помоћу Питхона. Будући да су КСМЛ датотеке сличне ХТМЛ датотекама, он их такође може рашчланити. Ипак, да бисте рашчланили КСМЛ датотеке помоћу БеаутифулСоуп-а, најбоље је да користите Питхон-ове лкмл парсер.

Обе библиотеке можете да инсталирате помоћу пип алат за инсталацију, кроз наредбу испод:

пип инсталл бс4 лкмл

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

Ево примера:

$ питхон
Питхон 3.7.4 (тагови / в3.7.4: е09359112е, 8. јул 2019., 20:34:20)
[МСЦ в.1916 64 бит (АМД64)] на вин32
Унесите „помоћ“, „ауторска права“, „кредити“ или „лиценца“ за више информација.
>>> увоз бс4
>>> увоз лкмл
>>>

Пре него што наставите, требало би да креирате КСМЛ датотеку из исечка кода у наставку. Прилично је једноставно и требало би да одговара случајевима употребе о којима ћете сазнати у остатку чланка. Једноставно копирајте, налепите у свој едитор и сачувајте; име попут узорак.кмл треба да буде довољно.



Дрво

Први
Друго

Треће

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


Четврто

Сада, у вашој Питхон скрипти; мораћете да прочитате КСМЛ датотеку као нормалну датотеку, а затим је проследите у БеаутифулСоуп. У остатку овог чланка користиће се бс_цонтент променљива, па је важно да направите овај корак.

# Увези БеаутифулСоуп
из бс4 увози БеаутифулСоуп као бс
садржај = []
# Прочитајте КСМЛ датотеку
са отвореним („узорак.кмл "," р ") као датотека:
# Прочитајте сваки ред у датотеци, реадлинес () враћа листу линија
садржај = датотека.реадлинес ()
# Комбинујте редове на листи у низ
цонтент = "".придружи се (садржај)
бс_цонтент = бс (цонтент, "лкмл")

Узорак кода изнад увоза БеаутифулСоуп, онда чита КСМЛ датотеку као обичну датотеку. Након тога преноси садржај у увезени БеаутифулСоуп библиотека као и парсер по избору.

Приметићете да се код не увози лкмл. Не мора као БеаутифулСоуп изабраће лкмл парсер као резултат додавања „Лкмл“ у објекат.

Сада можете да наставите са остатком чланка.

Проналажење ознака

Једна од најважнијих фаза рашчлањивања КСМЛ датотека је тражење ознака. Постоје различити начини да се то постигне када се користи БеаутифулСоуп; тако да морате знати за неколицину њих да бисте имали најбоље алате за одговарајућу ситуацију.

Ознаке у КСМЛ документима можете пронаћи на следећи начин:

Проналажење ознака по именима

Постоје две методе БеаутифулСоуп које можете користити приликом проналажења ознака према именима. Међутим, случајеви употребе се разликују; погледајмо их.

наћи

Из личног искуства користићете наћи метода чешће од осталих метода за проналажење ознака у овом чланку. Ознака за проналажење прима име ознаке коју желите да добије и враћа БеаутифулСоуп објект ознаке ако је пронађе; иначе се враћа Ниједан.

Ево примера:

>>> резултат = бс_цонтент.пронађи („подаци“)
>>> испис (резултат)
Једно
>>> резултат = бс_цонтент.пронађи ("јединствено")
>>> испис (резултат)
Близанци
>>> резултат = бс_цонтент.пронађи ("отац")
>>> испис (резултат)
Ниједан
>>> резултат = бс_цонтент.пронађи ("мајка")
>>> испис (резултат)
Ниједан

Ако погледате пример, видећете да наћи метода враћа ознаку ако се подудара са именом, у супротном враћа Ноне. Међутим, ако га пажљивије погледате, видећете да враћа само једну ознаку.

На пример, када пронађи („подаци“) је позван, вратио је само прву ознаку података, али није вратио остале.

ГОТЦХА: Тхе наћи метода ће вратити само прву ознаку која се подудара са њеним упитом.

Па како доћи и до других ознака? То нас води до следеће методе.

финд_алл

Тхе финд_алл метода је прилично слична наћи метода. Једина разлика је у томе што враћа листу ознака које се подударају са њеним упитом. Када не пронађе ниједну ознаку, једноставно враћа празну листу. Стога, финд_алл увек ће вратити листу.

Ево примера:

>>> резултат = бс_цонтент.финд_алл ("подаци")
>>> испис (резултат)
[Једно, Два]
>>> резултат = бс_цонтент.финд_алл ("дете")
>>> испис (резултат)
[Први, Друго,
Треће

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

, Четврто]
>>> резултат = бс_цонтент.финд_алл ("отац")
>>> испис (резултат
[]
>>> резултат = бс_цонтент.финд_алл ("мајка")
>>> испис (резултат)
[]

Сада када знате како да користите наћи и финд_алл методе, можете да тражите ознаке било где у КСМЛ документу. Међутим, можете да учините претраге моћнијим.

Ево како:

Неке ознаке могу имати исто име, али различите атрибуте. На пример, дете ознаке имају а име атрибут и различите вредности. На основу њих можете вршити одређене претраге.

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

>>> резултат = бс_цонтент.пронађи ("дете", "име": "Ружа")
>>> испис (резултат)
Друго
>>> резултат = бс_цонтент.финд_алл ("дете", "наме": "Росе")
>>> испис (резултат)
[Друго]
>>> резултат = бс_цонтент.пронађи ("дете", "наме": "Јацк")
>>> испис (резултат)
Први
>>> резултат = бс_цонтент.финд_алл ("дете", "наме": "Јацк")
>>> испис (резултат)
[Први]

Видећете да постоји нешто другачије у коришћењу наћи и финд_алл методе овде: обојица имају други параметар.

Када предате речник као други параметар, наћи и финд_алл методе даље претражују како би добили ознаке које имају атрибуте и вредности који одговарају наведеном пару кључ: вредност.

На пример, упркос томе што користите наћи метода у првом примеру, вратила је други дете ознака (уместо прве дете таг), јер је то прва ознака која се подудара са упитом. Тхе финд_алл Ознака следи исти принцип, осим што враћа све ознаке које се подударају са упитом, а не само прву.

Проналажење ознака према везама

Иако је мање популаран од претраживања по именима ознака, ознаке можете претраживати и према односима. У стварном смислу, то је више навигација него тражење.

У КСМЛ документима постоје три кључне везе:

Из горњег објашњења можете закључити да је референтна ознака најважнији фактор у претраживању ознака према односима. Стога, потражимо референтну ознаку и наставимо чланак.

Погледај ово:

>>> тхирд_цхилд = бс_цонтент.пронађи ("дете", "име": "Плави бршљан")
>>> испис (тхирд_цхилд)

Треће

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

Из горњег узорка кода, референтна ознака за остатак овог одељка биће трећа дете ознака, сачувана у а тхирд_цхилд променљива. У потпоглављима испод видећете како да претражујете ознаке на основу односа родитеља, брата и деце са референтном ознаком.

Проналажење родитеља

Да бисте пронашли надређену ознаку референтне ознаке, користићете родитељ атрибут. На овај начин се враћа родитељска ознака, као и ознаке испод ње. Ово понашање је сасвим разумљиво, јер су дечије ознаке део родитељске ознаке.

Ево примера:

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

Први
Друго

Треће

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


Четврто

Проналажење деце

Да бисте пронашли подређене ознаке референтне ознаке, користићете деца атрибут. На овај начин се враћају подређене ознаке, као и под-ознаке испод сваке од њих. Ово понашање је такође разумљиво, јер дечје ознаке често имају и своје дечје ознаке.

Треба напоменути да је деца атрибут враћа дечје ознаке као генератор. Дакле, ако вам је потребна листа подређених ознака, мораћете да претворите генератор у листу.

Ево примера:

>>> резултат = листа (тхирд_цхилд.деца)
>>> испис (резултат)
['\ н Треће \ н',
Једно
Два
Близанци
, '\ н']

Ако пажљивије погледате горњи пример, приметићете да неке вредности на листи нису ознаке. То је нешто на шта морате пазити.

ГОТЦХА: Тхе деца атрибут не враћа само подређене ознаке, већ враћа и текст у референтној ознаци.

Проналажење браће и сестара

Последње у овом одељку је проналажење ознака које су брата и сестре референтне ознаке. За сваку референтну ознаку могу постојати ознаке сродника пре и после ње. Тхе превиоус_сиблингс атрибут вратит ће ознаке сродника прије референтне ознаке, а нект_сиблингс атрибут вратит ће ознаке брата или сестре након њега.

Баш као и деца атрибут, превиоус_сиблингс и нект_сиблингс атрибути ће вратити генераторе. Дакле, потребно је да се претворите у списак ако вам је потребан списак браће и сестара.

Погледај ово:

>>> превиоус_сиблингс = листа (тхирд_цхилд.превиоус_сиблингс)
>>> принт (превиоус_сиблингс)
['\ н', Друго, '\ н',
Први, '\ н']
>>> нект_сиблингс = листа (тхирд_цхилд.нект_сиблингс)
>>> испис (нект_сиблингс)
['\ н', Четврто]
>>> испис (превиоус_сиблингс + нект_сиблингс)
['\ н', Друго, '\ н', Први,
'\ н', '\ н', Четврто, '\ н']

Први пример приказује претходну браћу и сестре, други приказује следећу браћу и сестре; тада се оба резултата комбинују да би се генерисала листа свих браће и сестара за референтну ознаку.

Издвајање из ознака

При рашчлањивању КСМЛ докумената, много посла лежи у проналажењу правих ознака. Међутим, када их пронађете, можда ћете желети и да извучете одређене информације из тих ознака, а томе ће вас научити овај одељак.

Видећете како да издвојите следеће:

Издвајање вредности атрибута ознаке

Понекад можете имати разлог за издвајање вредности за атрибуте у ознаци. На пример, у следећем упаривању вредности атрибут-вредност: наме = "Ружа", можда ћете желети да издвојите „Росе.”

Да бисте то урадили, можете да користите добити методу или приступу имену атрибута помоћу [] попут индекса, баш као када бисте радили са речником.

Ево примера:

>>> резултат = треће_дете.гет ("име")
>>> испис (резултат)
Блуе Иви
>>> резултат = треће_дете ["име"]
>>> испис (резултат)
Блуе Иви

Издвајање текста ознаке

Када желите да приступите текстуалним вредностима ознаке, можете да користите текст или жице атрибут. Обоје ће вратити текст у ознаку, па чак и подређене ознаке. Међутим текст атрибут ће их вратити као један низ, уједињени; док жице атрибут ће их вратити као генератор који можете претворити у листу.

Ево примера:

>>> резултат = треће_дете.текст
>>> испис (резултат)
'\ н Трећи \ н \ нЈедан \ нДва \ нБлаза \ н \ н'
>>> резултат = листа (тхирд_цхилд.жице)
>>> испис (резултат)
['\ н Трећи \ н', '\ н', 'Један', '\ н', 'Два', '\ н', 'Близанци', '\ н', '\ н']

Издвајање садржаја ознаке

Поред издвајања вредности атрибута и текста ознаке, такође можете издвојити сав садржај ознака. Да бисте то урадили, можете користити садржај атрибут; помало је сличан деца атрибут и даће исте резултате. Међутим, док је деца атрибут враћа генератор, садржај атрибут враћа листу.

Ево примера:

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

Лепо штампање

До сада сте видели неке важне методе и атрибуте који су корисни при рашчлањивању КСМЛ докумената помоћу БеаутифулСоуп-а. Али ако приметите, када штампате ознаке на екрану, оне имају некакав скупљени изглед. Иако изглед можда неће имати директан утицај на вашу продуктивност, може вам помоћи да ефикасније рашчланите и учините посао мање досадним.

Ево примера уобичајеног штампања:

>>> испис (тхирд_цхилд)

Треће

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

Међутим, можете побољшати његов изглед помоћу преттифи метода. Једноставно назовите преттифи методом на ознаци током штампања и добићете нешто визуелно угодно.

Погледај ово:

Закључак

Рашчлањивање докумената је важан аспект набаве података. КСМЛ документи су прилично популарни и надамо се да сте боље опремљени за њихово преузимање и издвајање података које желите.

Из овог чланка сада можете:

Ако се осећате прилично изгубљено и прилично сте нови у библиотеци БеаутифулСоуп, можете погледати лекције за БеаутифулСоуп за почетнике.

Екран Трацкпад и показивач миша АппиМоусе за Виндовс таблете
Корисницима таблета често недостаје показивач миша, посебно када су уобичајени за коришћење преносних рачунара. Паметни телефони и таблети на додир ос...
Средњи тастер миша не ради у оперативном систему Виндовс 10
Тхе средње дугме миша помаже вам да се крећете кроз дугачке веб странице и екране са пуно података. Ако се то заустави, на крају ћете користити тастат...
Како да промените леви и десни тастер миша на рачунару са Виндовс 10
Сасвим је нормално да су сви уређаји рачунарског миша ергономски дизајнирани за дешњаке. Али постоје доступни уређаји за миш који су посебно дизајнира...