Pre začiatočníkov v škrabaní webu s BeautifulSoup, článok diskutujúci o konceptoch škrabania webu v tejto výkonnej knižnici nájdete tu.
Tento článok je určený pre programátorov, analytikov údajov, vedcov alebo inžinierov, ktorí už majú zručnosti v získavaní obsahu z webových stránok pomocou programu BeautifulSoup. Pokiaľ nemáte žiadne vedomosti o tejto knižnici, odporúčam vám prejsť si tutoriál BeautifulSoup pre začiatočníkov.
Teraz môžeme pokračovať - chcem veriť, že túto knižnicu už máte nainštalovanú. Ak nie, môžete to urobiť pomocou nižšie uvedeného príkazu:
pip nainštalujte BeautifulSoup4Pretože pracujeme s extrakciou údajov z HTML, musíme mať základnú stránku HTML, aby sme si tieto koncepty mohli precvičiť. V tomto článku by sme tento útržok HTML použili na precvičenie. Nasledujúci úryvok HTML priradím premennej pomocou trojitých úvodzoviek v Pythone.
sample_content = "" "
Na vytvorenie neusporiadaného zoznamu sa používa značka ul:
- Prvá možnosť
- Druhá možnosť
Tu je neusporiadaný zoznam
Na vytvorenie zoradeného zoznamu sa používa značka ol:
- Číslo jeden
- Číslo dva
Tu je zoradený zoznam
Hint pre Linux, 2018
„“ „
Teraz, keď sme to zoradili, prejdime priamo k práci s knižnicou BeautifulSoup.
Budeme využívať niekoľko metód a atribútov, ktoré by sme volali na náš objekt BeautifulSoup. Potrebovali by sme však analyzovať náš reťazec pomocou programu BeautifulSoup a potom ho priradiť k premennej „our_soup“.
z bs4 importujte BeautifulSoup ako bsoour_soup = bso (sample_content, "lxml")
Odteraz budeme pracovať s premennou „our_soup“ a volať na ňu všetky naše atribúty alebo metódy.
Stručne povedané, ak ešte neviete, čo je podradený uzol, v zásade ide o uzol (značku), ktorý existuje vo vnútri iného uzla. Napríklad v našom úryvku HTML sú značky li podradené uzly značiek „ul“ a „ol“.
Tu sú metódy, na ktoré by sme sa pozreli:
- findChild
- nájsť deti
- obsah
- deti
- potomkovia
findChild ():
The findChild metóda sa používa na nájdenie prvého podradeného uzla prvkov HTML. Napríklad keď sa pozrieme na naše značky „ol“ alebo „ul“, našli by sme v nich dve detské značky. Keď však použijeme findChild metóda vráti iba prvý uzol ako podradený uzol.
Táto metóda by sa mohla ukázať ako veľmi užitočná, ak chceme získať iba prvý podradený uzol prvku HTML, pretože okamžite vráti požadovaný výsledok.
Vrátený objekt je typu bs4.element.Označiť. Text z neho môžeme extrahovať volaním textového atribútu.
Tu je príklad:
first_child = our_soup.nájsť („telo“).nájsť („ol“)tlač (prvé_dieťa.findChild ())
Vyššie uvedený kód vráti nasledujúce:
Ak chcete získať text zo značky, hovoríme text atribút.
Páči sa mi to:
tlač (prvé_dieťa.findChild ().text)Ak chcete získať nasledujúci výsledok:
'Číslo jeden'findChildren ():
Pozreli sme sa na findChild metóda a videli, ako to funguje. The nájsť deti metóda funguje podobným spôsobom, ale ako už z názvu vyplýva, nenájde iba jeden podradený uzol, získa všetky podriadené uzly v značke.
Ak potrebujete získať všetky podradené uzly v značke, znak nájsť deti metóda je správna cesta. Táto metóda vráti všetky podradené uzly v zozname, k značke podľa vášho výberu môžete pristupovať pomocou jej indexového čísla.
Tu je príklad:
first_child = our_soup.nájsť („telo“).nájsť („ol“)tlač (prvé_dieťa.findChildren ())
To by vrátilo podradené uzly v zozname:
[Ak chcete získať druhý podradený uzol v zozname, prácu by urobil nasledujúci kód:
tlač (prvé_dieťa.findChildren () [1])Ak chcete získať nasledujúci výsledok:
To je všetko, čo spoločnosť BeautifulSoup poskytuje, pokiaľ ide o metódy. Tým to však nekončí. Atribúty možno tiež volať na našich objektoch BeautifulSoup, aby sme získali uzol potomka / potomka / potomka z prvku HTML.
obsah:
Kým nájsť deti metóda urobila priamu prácu pri extrakcii detských uzlov, obsah atribúty robí niečo trochu iné.
The obsah Atribút vráti zoznam všetkého obsahu v prvku HTML vrátane podradených uzlov. Takže keď zavoláte na obsah atribút na objekte BeautifulSoup, vrátil by text ako reťazce a uzly v značkách ako a bs4.element.Označiť objekt.
Tu je príklad:
first_child = our_soup.nájsť („telo“).nájsť („ol“)tlač (prvé_dieťa.obsah)
Takto sa vráti toto:
["\ n Tu je zoradený zoznam \ n",„\ n“,
Ako vidíte, zoznam obsahuje text, ktorý sa nachádza pred podradeným uzlom, podradený uzol a text, ktorý nasleduje za podradeným uzlom.
Na prístup k druhému podriadenému uzlu stačí, aby sme využili jeho indexové číslo, ako je uvedené nižšie:
tlač (prvé_dieťa.obsah [3])Takto by sa vrátilo toto:
deti:
Tu je jeden atribút, ktorý robí takmer to isté ako atribút obsah. Má však jeden malý rozdiel, ktorý by mohol mať obrovský vplyv (pre tých, ktorí to s optimalizáciou kódu myslia vážne).
Atribút deti tiež vráti text, ktorý sa nachádza pred podradeným uzlom, samotný podradený uzol a text, ktorý nasleduje za podradeným uzlom. Rozdiel je v tom, že ich namiesto zoznamu vráti ako generátor.
Pozrime sa na nasledujúci príklad:
first_child = our_soup.nájsť („telo“).nájsť („ol“)tlač (prvé_dieťa.deti)
Vyššie uvedený kód poskytuje nasledujúce výsledky (adresa vášho zariadenia sa nemusí zhodovať s adresou nižšie):
Ako vidíte, vráti iba adresu generátora. Tento generátor by sme mohli previesť do zoznamu.
Vidíme to na príklade nižšie:
first_child = our_soup.nájsť („telo“).nájsť („ol“)tlač (zoznam (prvé_dieťa.deti))
To dáva nasledujúci výsledok:
["\ n Tu je zoradený zoznam \ n",„\ n“,
potomkovia:
Kým deti atribút funguje tak, že sa do značky dostane iba obsah i.e. text a uzly na prvej úrovni, potomkovia atribút ide hlbšie a robí viac.
The potomkovia získa všetok text a uzly, ktoré existujú v podradených uzloch. Takže nevracia iba uzly detí, ale vracia aj uzly vnúčat.
Okrem vrátenia textu a značiek tiež vráti obsah značiek ako reťazce.
Rovnako ako deti atribút, potomkovia vráti svoje výsledky ako generátor.
Toto môžeme vidieť nižšie:
first_child = our_soup.nájsť („telo“).nájsť („ol“)tlač (prvé_dieťa.potomkovia)
To dáva nasledujúci výsledok:
Ako sme už videli, potom môžeme tento objekt generátora previesť do zoznamu:
first_child = our_soup.nájsť („telo“).nájsť („ol“)tlač (zoznam (prvé_dieťa.potomkovia))
Dostali by sme zoznam nižšie:
["\ n Tu je zoradený zoznam \ n",'Number One', '\ n',
Záver
Máte to, päť rôznych spôsobov prístupu k podradeným uzlom v prvkoch HTML. Môže existovať viac spôsobov, avšak s metódami a atribútmi popísanými v tomto článku by mal mať človek prístup k podradenému uzlu ľubovoľného prvku HTML.