BeautifulSoup

Намиране на детски възли с красива супа

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

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

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

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

pip инсталирайте BeautifulSoup4

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

sample_content = "" "

LinuxHint



За да се направи неподреден списък, се използва ul таг:
 




За да се направи подреден списък, се използва таг ol:
 


    Ето подреден списък
  1. Номер едно

  2. Номер две



Подсказка за Linux, 2018



""

След като сме подредили това, нека да преминем направо към работата с библиотеката BeautifulSoup.

Ще използваме няколко метода и атрибути, които бихме извикали на нашия обект BeautifulSoup. Трябва обаче да анализираме нашия низ с помощта на BeautifulSoup и след това да присвоим на променлива “our_soup”.

от bs4 импортирайте BeautifulSoup като bso
our_soup = bso (sample_content, "lxml")

Оттук нататък ще работим с променливата „our_soup“ и ще извикаме всички наши атрибути или методи върху нея.

Накратко, ако все още не знаете какво е дъщерен възел, това е основно възел (таг), който съществува вътре в друг възел. В нашия HTML фрагмент например, етикетите li са дъщерни възли на маркерите „ul“ и „ol“.

Ето методите, които бихме разгледали:

findChild ():

The findChild метод се използва за намиране на първия дъщерен възел на HTML елементи. Например, когато разгледаме нашите маркери „ol“ или „ul“, ще намерим две дъщерни тагове в него. Когато обаче използваме findChild метод, той връща само първия възел като дъщерен възел.

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

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

Ето пример:

first_child = our_soup.намери ("тяло").намиране ("ol")
печат (first_child.findChild ())

Кодът по-горе ще върне следното:

  • Номер едно
  • За да получим текста от маркера, извикваме текст атрибут върху него.

    Като:

    печат (first_child.findChild ().текст)

    За да получите следния резултат:

    'Номер едно'
    findChildren ():

    Разгледахме findChild метод и видях как работи. The findChildren метод работи по сходни начини, но както подсказва името, той не намира само един детски възел, той получава всички дъщерни възли в таг.

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

    Ето пример:

    first_child = our_soup.намери ("тяло").намиране ("ol")
    печат (first_child.findChildren ())

    Това ще върне децата възли в списък:

    [
  • Номер едно
  • ,
  • Номер две
  • ]

    За да получите втория дъщерен възел в списъка, следният код ще свърши работа:

    печат (first_child.findChildren () [1])

    За да получите следния резултат:

  • Номер две
  • Това е всичко, което BeautifulSoup предоставя, що се отнася до методите. Това обаче не свършва дотук. Атрибутите могат също да бъдат извикани на нашите обекти BeautifulSoup, за да получат възела дете / деца / потомък от HTML елемент.

    съдържание:

    Докато findChildren методът свърши директната работа по извличане на възлите на децата, съдържание attributes прави нещо малко по-различно.

    The съдържание attribute връща списък с цялото съдържание в HTML елемент, включително дъщерните възли. Така че, когато се обадите на съдържание атрибут на BeautifulSoup обект, той би върнал текста като низове, а възлите в маркерите като bs4.елемент.Етикет обект.

    Ето пример:

    first_child = our_soup.намери ("тяло").намиране ("ol")
    печат (first_child.съдържание)

    Това връща следното:

    ["\ n Ето подреден списък \ n",
  • Номер едно
  • ,
    '\н',
  • Номер две
  • , '\н']

    Както можете да видите, списъкът съдържа текста, който идва преди дъщерния възел, дъщерния възел и текста, който идва след дъщерния възел.

    За да осъществим достъп до втория дъщерен възел, всичко, което трябва да направим, е да използваме неговия индексен номер, както е показано по-долу:

    печат (first_child.съдържание [3])

    Това ще върне следното:

  • Номер две
  • деца:

    Ето един атрибут, който прави почти същото нещо като атрибута content. Има обаче една малка разлика, която може да окаже огромно въздействие (за тези, които се отнасят сериозно към оптимизацията на кода).

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

    Нека да разгледаме следния пример:

    first_child = our_soup.намери ("тяло").намиране ("ol")
    печат (first_child.деца)

    Кодът по-горе дава следните резултати (адресът на вашата машина не трябва да съвпада с този по-долу):

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

    Това можем да видим в примера по-долу:

    first_child = our_soup.намери ("тяло").намиране ("ol")
    print (list (first_child.деца))

    Това дава следния резултат:

    ["\ n Ето подреден списък \ n",
  • Номер едно
  • ,
    '\н',
  • Номер две
  • , '\н']

    потомци:

    Докато деца атрибут работи върху получаването само на съдържанието вътре в таг i.д. текста и възлите на първо ниво, потомци атрибут се задълбочава и прави повече.

    The потомци attribute получава целия текст и възли, които съществуват в дъщерни възли. Така че не връща само детски възли, а и внуци.

    Освен връщането на текста и таговете, той също връща съдържанието в етикетите като низове.

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

    Можем да видим това по-долу:

    first_child = our_soup.намери ("тяло").намиране ("ol")
    печат (first_child.потомци)

    Това дава следния резултат:

    Както се вижда по-рано, след това можем да преобразуваме този обект на генератор в списък:

    first_child = our_soup.намери ("тяло").намиране ("ol")
    print (list (first_child.потомци))

    Ще получим списъка по-долу:

    ["\ n Ето подреден списък \ n",
  • Номер едно
  • ,
    „Номер едно“, „\ n“,
  • Номер две
  • , 'Номер две', '\ n']

    Заключение

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

    Как да заснемете и поточно предадете игралната си сесия на Linux
    В миналото играта на игри се смяташе само за хоби, но с течение на времето игралната индустрия отбеляза огромен ръст по отношение на технологиите и бр...
    Най-добрите игри за игра с ръчно проследяване
    Oculus Quest наскоро представи страхотната идея за ръчно проследяване без контролери. С непрекъснато нарастващия брой игри и дейности, които изпълнява...
    Как да покажете OSD наслагване в приложения на цял екран за Linux и игри
    Играта на цял екран или използване на приложения в режим на цял екран без разсейване може да ви откъсне от съответната системна информация, видима в п...