За начинаещи в уеб изстъргването с BeautifulSoup, статия, обсъждаща концепциите за изстъргване в мрежата с тази мощна библиотека, може да бъде намерена тук.
Тази статия е за програмисти, анализатори на данни, учени или инженери, които вече имат набор от умения за извличане на съдържание от уеб страници с помощта на BeautifulSoup. Ако нямате никакви познания за тази библиотека, съветвам ви да преминете през урок BeautifulSoup за начинаещи.
Сега можем да продължим - искам да вярвам, че вече имате инсталирана тази библиотека. Ако не, можете да направите това, като използвате командата по-долу:
pip инсталирайте BeautifulSoup4Тъй като работим с извличане на данни от HTML, трябва да имаме основна HTML страница, на която да практикуваме тези концепции. За тази статия бихме използвали този HTML фрагмент за практика. Ще присвоя следния HTML фрагмент на променлива, използвайки тройните кавички в Python.
sample_content = "" "
За да се направи неподреден списък, се използва ul таг:
- Първи вариант
- Втори вариант
Ето неуреден списък
За да се направи подреден списък, се използва таг ol:
- Номер едно
- Номер две
Ето подреден списък
Подсказка за Linux, 2018
""
След като сме подредили това, нека да преминем направо към работата с библиотеката BeautifulSoup.
Ще използваме няколко метода и атрибути, които бихме извикали на нашия обект BeautifulSoup. Трябва обаче да анализираме нашия низ с помощта на BeautifulSoup и след това да присвоим на променлива “our_soup”.
от bs4 импортирайте BeautifulSoup като bsoour_soup = bso (sample_content, "lxml")
Оттук нататък ще работим с променливата „our_soup“ и ще извикаме всички наши атрибути или методи върху нея.
Накратко, ако все още не знаете какво е дъщерен възел, това е основно възел (таг), който съществува вътре в друг възел. В нашия HTML фрагмент например, етикетите li са дъщерни възли на маркерите „ul“ и „ol“.
Ето методите, които бихме разгледали:
- findChild
- findChildren
- съдържание
- деца
- потомци
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“,
Заключение
Ето го, пет различни начина за достъп до детски възли в HTML елементи. Може да има повече начини, но с методите и атрибутите, обсъдени в тази статия, човек трябва да има достъп до дъщерния възел на всеки HTML елемент.