XML-failide sõelumisel on kaks peamist aspekti. Nemad on:
- Siltide leidmine
- Siltidest väljavõtmine
Peate leidma märgendi, mis sisaldab soovitud teavet, ja seejärel selle teabe ekstraktima. Enne selle artikli lõppu saate teada, kuidas XML-failidega töötamisel mõlemat teha.
Paigaldamine
BeautifulSoup on Pythoniga veebi kraapimise osas üks kõige enam kasutatavaid teeke. Kuna XML-failid sarnanevad HTML-failidega, on see võimeline neid ka sõeluma. XML-failide sõelumiseks BeautifulSoupi abil on kõige parem kasutada Pythoni faile lxml parser.
Mõlemat teeki saate installida, kasutades pip installimistööriista alloleva käsu kaudu:
pip install bs4 lxmlMõlema teegi eduka installimise kinnitamiseks võite aktiveerida interaktiivse kesta ja proovida mõlemat importida. Kui ühtegi viga ei kuvata, olete valmis jätkama ülejäänud artiklit.
Siin on näide:
$ pythonPython 3.7.4 (sildid / v3.7.4: e09359112e, 8. juuli 2019, 20:34:20)
[MSC v.1916 64 bit (AMD64)] Win32-l
Lisateabe saamiseks sisestage "abi", "autoriõigus", "krediit" või "litsents".
>>> import bs4
>>> impordi lxml
>>>
Enne jätkamist peaksite looma XML-faili allolevast koodijupist. See on üsna lihtne ja peaks sobima kasutusjuhtumitega, mille kohta saate teada ülejäänud artiklist. Lihtsalt kopeerige, kleepige redaktorisse ja salvestage; nimi nagu proov.xml peaks piisama.
Puu
Kolmandaks
Üks
Kaks
Nüüd oma Pythoni skriptis; peate XML-faili lugema nagu tavalist faili, seejärel edastama selle BeautifulSoupi. Selle artikli ülejäänud osa kasutab järgmist bs_content muutuja, seega on oluline, et teete selle sammu.
# Impordi BeautifulSoupbs4-st importige BeautifulSoup b-dena
sisu = []
# Lugege XML-faili
avatud ("proov.xml "," r ") failina:
# Lugege failis kõiki ridu, readlines () tagastab ridade loendi
sisu = fail.readlines ()
# Ühendage loendis olevad read stringiks
sisu = "".liitu (sisu)
bs_content = bs (sisu, "lxml")
Impordi kohal olev koodivalim IlusSupp, siis loeb see XML-faili nagu tavaline fail. Pärast seda edastab see sisu imporditud IlusSupp raamatukogu kui ka valitud parser.
Märkate, et koodi ei impordita lxml. See ei pea nii olema IlusSupp valib lxml parser läbimise tagajärjel „Lxml” objektile.
Nüüd saate jätkata ülejäänud artikliga.
Siltide leidmine
XML-failide sõelumise üks olulisemaid etappe on siltide otsimine. BeautifulSoupi kasutamisel on selle saavutamiseks mitu võimalust; nii et peate teadma käputäie kohta, et teil oleks sobiva olukorra jaoks parimad tööriistad.
XML-dokumentidest leiate sildid järgmiselt:
- Nimed
- Suhted
Siltide leidmine nimede järgi
Nimede järgi siltide leidmisel võite kasutada kahte meetodit BeautifulSoup. Kasutusjuhud on siiski erinevad; heidame neile pilgu.
leidma
Isikliku kogemuse põhjal kasutate leidma meetodit sagedamini kui teisi selles artiklis märgendite leidmise. Leidemärgis võtab vastu märgendi nime, mille soovite hankida, ja tagastab sildi objekti BeautifulSoup, kui selle leiab; muul juhul naaseb Puudub.
Siin on näide:
>>> tulemus = bs_content.leidma ("andmed")>>> print (tulemus)
Üks
>>> tulemus = bs_content.leidma ("ainulaadne")
>>> print (tulemus)
>>> tulemus = bs_content.leidma ("isa")
>>> print (tulemus)
Puudub
>>> tulemus = bs_content.leidma ("ema")
>>> print (tulemus)
Puudub
Kui vaatate näidet, näete, et leidma meetod tagastab sildi, kui see sobib nimega, muidu tagastab Puudub. Kui vaatate seda lähemalt, näete, et see tagastab ainult ühe sildi.
Näiteks millal leidma („andmed”) helistati, tagastas see ainult esimese andmesildi, kuid ei tagastanud teisi.
GOTCHA: The leidma meetod tagastab ainult esimese sildi, mis vastab tema päringule.
Niisiis, kuidas leida ka teisi silte? See viib meid järgmise meetodini.
leidma kõik
The leidma kõik meetod on üsna sarnane meetodile leidma meetod. Ainus erinevus on see, et see tagastab loendi siltidest, mis vastavad tema päringule. Kui see ühtegi silti ei leia, tagastab see lihtsalt tühja loendi. Seega, leidma kõik tagastab alati loendi.
Siin on näide:
>>> tulemus = bs_content.find_all ("andmed")>>> print (tulemus)
[Üks, Kaks]
>>> tulemus = bs_content.find_all ("laps")
>>> print (tulemus)
[
Kolmandaks
Üks
Kaks
>>> tulemus = bs_content.find_all ("isa")
>>> print (tulemus
[]
>>> tulemus = bs_content.find_all ("ema")
>>> print (tulemus)
[]
Nüüd, kui teate, kuidas seda kasutada leidma ja leidma kõik meetodite abil saate silte otsida kõikjal XML-dokumendis. Siiski saate oma otsinguid võimsamaks muuta.
Nii toimige järgmiselt
Mõnel sildil võib olla sama nimi, kuid erinevad atribuudid. Näiteks laps siltidel on a nimi atribuut ja erinevad väärtused. Nende põhjal saate teha konkreetseid otsinguid.
Vaadake seda:
>>> tulemus = bs_content.leidma ("laps", "nimi": "Roos")>>> print (tulemus)
>>> tulemus = bs_content.find_all ("laps", "nimi": "Roos")
>>> print (tulemus)
[
>>> tulemus = bs_content.leidma ("laps", "nimi": "Jack")
>>> print (tulemus)
>>> tulemus = bs_content.find_all ("laps", "nimi": "Jack")
>>> print (tulemus)
[
Näete, et selle kasutamisel on midagi muud leidma ja leidma kõik meetodid siin: mõlemal on teine parameeter.
Kui edastate sõnaraamatu teise parameetrina, kuvatakse leidma ja leidma kõik meetodid jätkavad nende otsimist siltide saamiseks, millel on atribuudid ja väärtused, mis sobivad pakutava võtmega: väärtuspaar.
Näiteks vaatamata leidma esimeses näites tagastas see teise laps silt (esimese laps silt), sest see on esimene päringule vastav silt. The leidma kõik silt järgib sama põhimõtet, välja arvatud see, et see tagastab kõik päringule vastavad sildid, mitte ainult esimese.
Siltide leidmine suhete järgi
Kuigi see pole nii populaarne kui siltide nimede järgi otsimine, saate silte otsida ka suhete järgi. Tegelikus mõttes on see siiski pigem navigeerimine kui otsimine.
XML-dokumentides on kolm võtmesuhet:
- Vanem: Silt, milles viitesilt olemas on.
- Lapsed: Viitesildis olevad sildid.
- Õed-vennad: Sildid, mis eksisteerivad võrdlussildiga samal tasemel.
Ülaltoodud selgituse põhjal võite järeldada, et viitesilt on kõige olulisem tegur seoste järgi siltide otsimisel. Seetõttu otsime viitesildi ja jätkame artiklit.
Vaadake seda:
>>> kolmas_laps = bs_sisu.leid ("laps", "nimi": "Sinine luuderohi")>>> print (kolmas_laps)
Kolmandaks
Üks
Kaks
Ülaltoodud koodinäidise põhjal on ülejäänud selle jaotise viitesilt kolmas laps silt, salvestatud a kolmas_laps muutuv. Allpool olevatest alajaotistest näete, kuidas otsida silte, lähtudes nende vanema, õe ja venna suhetest viitesildiga.
Vanemate leidmine
Viitemärgendi vanemmärgendi leidmiseks kasutage seda vanem atribuut. Seda tehes tagastatakse nii vanemasilt kui ka selle all olevad sildid. See käitumine on üsna arusaadav, kuna lastesildid on osa vanemasildist.
Siin on näide:
>>> tulemus = kolmas laps.vanem>>> print (tulemus)
Kolmandaks
Üks
Kaks
Laste leidmine
Viitemärgendi laste siltide leidmiseks kasutage seda lapsed atribuut. Seda tehes tagastatakse nii laste sildid kui ka nende all olevad alammärgendid. See käitumine on ka arusaadav, kuna ka lastemärgenditel on sageli oma lastemärgid.
Üks asi, mida peaksite märkima, on see, et lapsed atribuut tagastab laste sildid generaatorina. Nii et kui teil on vaja lastemärgendite loendit, peate generaatori teisendama loendiks.
Siin on näide:
>>> result = list (kolmas_laps.lapsed)>>> print (tulemus)
['\ n Kolmas \ n',
Üks
Kaks
Kui vaatate ülaltoodud näidet lähemalt, märkate, et mõned loendis olevad väärtused ei ole sildid. See on asi, mida peate jälgima.
GOTCHA: The lapsed atribuut tagastab mitte ainult laste sildid, vaid tagastab ka viitesildi teksti.
Õdede-vendade leidmine
Viimane selles jaotises on siltide leidmine, mis on viitesildi õed-vennad. Iga viitemärgise jaoks võib enne ja pärast olla õe-venna sildid. The eelmised_sõbrad atribuut tagastab õde-venna sildid enne viitemärgendit ja Järgmised_sõbrad atribuut tagastab õe-venna sildid pärast seda.
Täpselt nagu lapsed atribuut, eelmised_sõbrad ja Järgmised_sõbrad atribuudid tagastavad generaatorid. Nii et peate muutma loendiks, kui vajate õdede-vendade loendit.
Vaadake seda:
>>> eelmised_sõnumid = nimekiri (kolmas_laps.eelmised_sõbrad)>>> print (eelmised_õpikud)
['\ n',
>>> next_siblings = list (kolmas_laps.Järgmised_sõbrad)
>>> print (järgmine_sõbrad)
['\ n',
>>> print (eelmised_osad + järgmised_sõbrad)
['\ n',
'\ n', '\ n',
Esimene näide näitab eelmisi õdesid-vendi, teine näitab järgmisi õdesid-vendi; siis ühendatakse mõlemad tulemused, et luua kõigi võrdlusmärgendi õdede-vendade loend.
Siltidest väljavõtmine
XML-dokumentide sõelumisel seisneb suur töö õigete siltide leidmises. Kuid kui leiate need, võite ka nendest siltidest teatud teabe välja võtta ja seda see osa teile õpetab.
Näete, kuidas järgmist välja tõmmata:
- Sildi atribuudi väärtused
- Sildi tekst
- Sildi sisu
Märgise atribuudi väärtuste väljavõtmine
Mõnikord võib teil olla põhjust sildis olevate atribuutide väärtuste väljavõtmiseks. Näiteks järgmises atribuudi-väärtuse sidumises: nimi = ”Roos”, võiksite väljavõtte „Roos.”
Selleks saate kasutada saada meetodil või pääsete juurde atribuudi nimele [] nagu register, täpselt nagu teeksite sõnastikuga töötades.
Siin on näide:
>>> tulemus = kolmas laps.hankima ("nimi")>>> print (tulemus)
Sinine luuderohi
>>> tulemus = kolmas_laps ["nimi"]
>>> print (tulemus)
Sinine luuderohi
Siltteksti ekstraheerimine
Kui soovite juurde pääseda sildi tekstiväärtustele, saate kasutada nuppu teksti või stringid atribuut. Mõlemad tagastavad teksti märgendis ja isegi lapsed tagid. Siiski teksti atribuut tagastab need ühe stringina, liidetud; samal ajal kui stringid atribuut tagastab need generaatorina, mille saate teisendada loendiks.
Siin on näide:
>>> tulemus = kolmas laps.teksti>>> print (tulemus)
'\ n Kolmas \ n \ nÜks \ nKaks \ nKaks kaks korda \ n \ n'
>>> result = list (kolmas_laps.stringid)
>>> print (tulemus)
['\ n Kolmas \ n', '\ n', 'Üks', '\ n', 'Kaks', '\ n', 'Kaksikud', '\ n', '\ n']
Sildi sisu väljavõtmine
Lisaks atribuudiväärtuste ja sildi teksti väljavõtmisele saate ka kogu sildi sisu välja tõmmata. Selleks saate kasutada sisu atribuut; see on natuke sarnane lapsed atribuudi ja annab samad tulemused. Kuid kuigi lapsed atribuut tagastab generaatori sisu atribuut tagastab loendi.
Siin on näide:
>>> tulemus = kolmas_laps.sisu>>> print (tulemus)
['\ n Kolmas \ n',
Üks
Kaks
Ilus printimine
Siiani olete näinud mõnda olulist meetodit ja atribuuti, mis on kasulikud XML-dokumentide sõelumisel BeautifulSoupi abil. Kuid kui märkate, on siltide ekraanile printimisel neil mingi rühmitatud välimus. Kuigi välimus ei pruugi teie tootlikkust otseselt mõjutada, võib see aidata teil tõhusamalt sõeluda ja muuta töö vähem tüütuks.
Siin on näide tavalisel viisil printimisest:
>>> print (kolmas_laps)Kolmandaks
Üks
Kaks
Kuid saate selle välimust parandada, kasutades ilustama meetod. Helistage lihtsalt ilustama meetodit sildil printimise ajal ja saate midagi visuaalselt meeldivat.
Vaadake seda:
Järeldus
Dokumentide sõelumine on andmete hankimisel oluline aspekt. XML-dokumendid on üsna populaarsed ja loodetavasti on teil paremad võimalused nende vastuvõtmiseks ja soovitud andmete väljavõtmiseks.
Sellest artiklist saate nüüd:
- otsige silte kas nimede või seoste järgi
- andmete eemaldamine siltidest
Kui tunnete end üsna kaotsi ja olete BeautifulSoupi teegis üsna uus, võite tutvuda algajatele mõeldud BeautifulSoupi õpetusega.