1. HTML ağacında naviqasiya
Bu gün HTML ağaclarının möcüzəli dünyasına daxil olacağıq və veb-səhifələrdən məlumatları həqiqi proqramçı-ninja kimi çıxarmağı öyrənəcəyik. BeautifulSoup
kitabxanasından istifadə etməyə davam edərək lazım olan məlumatlara çatmağı və mövcud ağıllı skriptlərimizi daha da inkişaf etdirməyi öyrənəcəyik. Hazırlaşın, klaviaturalarınızı ayağa qaldırın və başlayaq!
Gəlin məlumatları çıxarmağa başlamazdan əvvəl, HTML ağacının nə olduğunu bir daha anlamağa çalışaq. Təsəvvür edin ki, bu nəhəng bir ailə ağacıdır, burada hər teq bir ayrı qohumdur. Ebeveynlər, uşaqlar, qardaşlar və bacılar var. Bizim vəzifəmiz – "qohumları" tapıb onlardan dəyərli ailə yadigarlarını (və ya məlumatları) diqqətlə çıxarmaqdır.
HTML-nin kiçik bir hissəsi belə görünə bilər:
<div class="article">
<h2 id="title">Başlıq</h2>
<p class="content">Bu, məqalənin mətnidir...</p>
<a href="https://example.com" class="link">Davamını oxu</a>
</div>
Burada bizdə div
var ki, bu, h2
, p
və a
üçün ebeveyn elementdir. Hər biri öz atributlarına və məzmununa malikdir.
2. Taglara görə məlumat çıxarma
BeautifulSoup
məlumat ağacında rahat naviqasiya və data çıxarmaq üçün əlverişli metodlar təklif edir. Başlayaq əsas metoddan - find()
, bu metod bizə müəyyən tag ilə olan ilk elementi tapmağa imkan verir. Amma find_all()
- tam bir axtarış buldozeri kimi, bütün elementləri həmin tag ilə qazıb çıxarır.
from bs4 import BeautifulSoup
html_doc = """<div class="article">
<h2 id="title">Başlıq</h2>
<p class="content">Bu məqalənin mətni...</p>
<a href="https://example.com" class="link">Oxumağa davam edin</a>
</div>"""
soup = BeautifulSoup(html_doc, 'html.parser')
# İlk paraqrafı tapırıq
first_paragraph = soup.find('p')
print(first_paragraph.text) # Çıxış: Bu məqalənin mətni...
# Bütün linkləri tapırıq
all_links = soup.find_all('a')
for link in all_links:
print(link['href']) # Çıxış: https://example.com
3. Elementləri filtrləmək üçün atributlardan istifadə
İndi teqlər üzrə axtarışı öyrəndiyimizə görə, atributlar istifadə edərək, belə ki id
və class
kimi, elementləri necə filtr etməyi öyrənməyin vaxtıdır. Bu atributlar səhifədə nəyin nə olduğuna bir işarə edir.
<div class="article">
<h2 id="title">Başlıq</h2>
<p class="content">Bu məqalənin mətnidir...</p>
<a href="https://example.com" class="link">Davamını oxu</a>
</div>
# Müəyyən bir id olan elementi tapırıq
title = soup.find(id="title")
print(title.text) # Çıxış: Başlıq
# "content" sinfi olan bütün elementləri tapırıq
content_paragraphs = soup.find_all(class_="content")
for p in content_paragraphs:
print(p.text) # Çıxış: Bu məqalənin mətnidir...
Vacibdir! Biz class_
istifadə edirik, class
əvəzinə — bu Python dilində rezerv olunmuş sözlə toqquşmanın qarşısını almaq üçündür.
4. Məlumat çıxarılması üzrə təcrübə şərtlərlə
İndi isə təcrübəyə başlayaq! Təsəvvür edin ki, sizə lazım olan məqalələrin böyük təkrarlanan HTML-massivindən linkləri və başlıqları çıxarmaqdır. Məlumatın nümunəsi və onunla necə işləməyiniz aşağıda göstərilib:
<div class="articles">
<div class="article">
<h2 class="title">Birinci məqalə</h2>
<a href="https://example.com/1" class="read-more">Daha ətraflı oxu</a>
</div>
<div class="article">
<h2 class="title">İkinci məqalə</h2>
<a href="https://example.com/2" class="read-more">Daha ətraflı oxu</a>
</div>
</div>
Və necə başlıqları və linkləri çıxara biləcəyimizi belə edə bilərik:
html_doc = """<div class="articles">
<div class="article">
<h2 class="title">Birinci məqalə</h2>
<a href="https://example.com/1" class="read-more">Daha ətraflı oxu</a>
</div>
<div class="article">
<h2 class="title">İkinci məqalə</h2>
<a href="https://example.com/2" class="read-more">Daha ətraflı oxu</a>
</div>
</div>"""
soup = BeautifulSoup(html_doc, 'html.parser')
articles = soup.find_all('div', class_='article')
for article in articles:
title = article.find('h2', class_='title').text
link = article.find('a', class_='read-more')['href']
print(f"Başlıq: {title}, Link: {link}")
# Çıxış:
# Başlıq: Birinci məqalə, Link: https://example.com/1
# Başlıq: İkinci məqalə, Link: https://example.com/2
5. Gizli tələlər haqqında
İndi, biliklərlə silahlanmışıq, gəlin bəzi tipik səhvlərə nəzər salaq. Ən çox yayılmış problemlərdən biri mövcud olmayan atributa müraciət etməyə çalışmaqdır. Bunun üçün Python dostcasına, amma yenə də narahatedici bir KeyError
mesajı ilə cavab verir. Bunun qarşısını almaq üçün, əgər atribut yoxdursa, defolt dəyər üçün .get()
metodundan istifadə edə bilərsiniz.
Bundan əlavə, mürəkkəb strukturu olan və iç-içə yerləşmiş HTML elementlərini unutmayın. BeautifulSoup
ilə məlumat çıxarmağa çalışmadan öncə səhifənin strukturunu doğru başa düşdüyünüzdən əmin olmaq üçün brauzerin səhifə kodunu görüntüləmə vasitəsindən istifadə edin.
Növbəti dayanacağımız isə məlumatı daha dəqiq əldə etmək üçün CSS-selektorların tətbiqidir. Beləliklə, bizimlə qalın, çünki BeautifulSoup
dünyasında macəralar hələ yeni başlayır!
GO TO FULL VERSION