Beautiful Soup - Mencari pohon
Ada banyak metode Beautifulsoup, yang memungkinkan kita mencari pohon parse. Dua metode yang paling umum dan digunakan adalah find () dan find_all ().
Sebelum berbicara tentang find () dan find_all (), mari kita lihat beberapa contoh filter berbeda yang dapat Anda berikan ke metode ini.
Jenis Filter
Kami memiliki filter berbeda yang dapat kami berikan ke metode ini dan pemahaman tentang filter ini sangat penting karena filter ini digunakan berulang kali, di seluruh API penelusuran. Kita dapat menggunakan filter ini berdasarkan nama tag, pada atributnya, pada teks string, atau campurannya.
Sebuah benang
Salah satu jenis filter yang paling sederhana adalah string. Meneruskan string ke metode pencarian dan Beautifulsoup akan melakukan pencocokan terhadap string yang sama persis.
Kode di bawah ini akan menemukan semua tag <p> dalam dokumen -
>>> markup = BeautifulSoup('<p>Top Three</p><p><pre>Programming Languages are:</pre></p><p><b>Java, Python, Cplusplus</b></p>')
>>> markup.find_all('p')
[<p>Top Three</p>, <p></p>, <p><b>Java, Python, Cplusplus</b></p>]
Ekspresi Reguler
Anda dapat menemukan semua tag yang dimulai dengan string / tag tertentu. Sebelumnya kita perlu mengimpor modul re untuk menggunakan ekspresi reguler.
>>> import re
>>> markup = BeautifulSoup('<p>Top Three</p><p><pre>Programming Languages are:</pre></p><p><b>Java, Python, Cplusplus</b></p>')
>>>
>>> markup.find_all(re.compile('^p'))
[<p>Top Three</p>, <p></p>, <pre>Programming Languages are:</pre>, <p><b>Java, Python, Cplusplus</b></p>]
Daftar
Anda dapat memberikan beberapa tag untuk ditemukan dengan memberikan daftar. Kode di bawah ini menemukan semua tag <b> dan <pre> -
>>> markup.find_all(['pre', 'b'])
[<pre>Programming Languages are:</pre>, <b>Java, Python, Cplusplus</b>]
Benar
True akan mengembalikan semua tag yang dapat ditemukannya, tetapi tidak ada string sendiri -
>>> markup.find_all(True)
[<html><body><p>Top Three</p><p></p><pre>Programming Languages are:</pre>
<p><b>Java, Python, Cplusplus</b> </p> </body></html>,
<body><p>Top Three</p><p></p><pre> Programming Languages are:</pre><p><b>Java, Python, Cplusplus</b></p>
</body>,
<p>Top Three</p>, <p></p>, <pre>Programming Languages are:</pre>, <p><b>Java, Python, Cplusplus</b></p>, <b>Java, Python, Cplusplus</b>]
Untuk mengembalikan hanya tag dari sup di atas -
>>> for tag in markup.find_all(True):
(tag.name)
'html'
'body'
'p'
'p'
'pre'
'p'
'b'
Temukan semua()
Anda dapat menggunakan find_all untuk mengekstrak semua kemunculan tag tertentu dari respons halaman sebagai -
Sintaksis
find_all(name, attrs, recursive, string, limit, **kwargs)
Mari kita ekstrak beberapa data menarik dari IMDB- "Film peringkat teratas" sepanjang masa.
>>> url="https://www.imdb.com/chart/top/?ref_=nv_mv_250"
>>> content = requests.get(url)
>>> soup = BeautifulSoup(content.text, 'html.parser')
#Extract title Page
>>> print(soup.find('title'))
<title>IMDb Top 250 - IMDb</title>
#Extracting main heading
>>> for heading in soup.find_all('h1'):
print(heading.text)
Top Rated Movies
#Extracting sub-heading
>>> for heading in soup.find_all('h3'):
print(heading.text)
IMDb Charts
You Have Seen
IMDb Charts
Top India Charts
Top Rated Movies by Genre
Recently Viewed
Dari atas, kita dapat melihat find_all akan memberi kita semua item yang cocok dengan kriteria pencarian yang kita tentukan. Semua filter yang dapat kita gunakan dengan find_all () dapat digunakan dengan find () dan metode pencarian lainnya juga seperti find_parents () atau find_siblings ().
Temukan()
Kita telah melihat di atas, find_all () digunakan untuk memindai seluruh dokumen untuk menemukan semua isinya kecuali sesuatu, persyaratannya adalah hanya menemukan satu hasil. Jika Anda mengetahui bahwa dokumen tersebut hanya berisi satu tag <body>, maka membuang-buang waktu untuk mencari seluruh dokumen. Salah satu caranya adalah memanggil find_all () dengan limit = 1 setiap kali atau kita dapat menggunakan metode find () untuk melakukan hal yang sama -
Sintaksis
find(name, attrs, recursive, string, **kwargs)
Jadi di bawah dua metode berbeda memberikan hasil yang sama -
>>> soup.find_all('title',limit=1)
[<title>IMDb Top 250 - IMDb</title>]
>>>
>>> soup.find('title')
<title>IMDb Top 250 - IMDb</title>
Dalam output di atas, kita bisa melihat metode find_all () mengembalikan daftar yang berisi item tunggal sedangkan metode find () mengembalikan hasil tunggal.
Perbedaan lain antara metode find () dan find_all () adalah -
>>> soup.find_all('h2')
[]
>>>
>>> soup.find('h2')
Jika metode soup.find_all () tidak dapat menemukan apa pun, ia mengembalikan daftar kosong sedangkan find () mengembalikan None.
find_parents () dan find_parent ()
Tidak seperti metode find_all () dan find () yang melintasi pohon, dengan melihat turunan tag, metode find_parents () dan find_parents () melakukan hal sebaliknya, metode ini melintasi pohon ke atas dan melihat induk tag (atau string).
Sintaksis
find_parents(name, attrs, string, limit, **kwargs)
find_parent(name, attrs, string, **kwargs)
>>> a_string = soup.find(string="The Godfather")
>>> a_string
'The Godfather'
>>> a_string.find_parents('a')
[<a href="/title/tt0068646/" title="Francis Ford Coppola (dir.), Marlon Brando, Al Pacino">The Godfather</a>]
>>> a_string.find_parent('a')
<a href="/title/tt0068646/" title="Francis Ford Coppola (dir.), Marlon Brando, Al Pacino">The Godfather</a>
>>> a_string.find_parent('tr')
<tr>
<td class="posterColumn">
<span data-value="2" name="rk"></span>
<span data-value="9.149038526210072" name="ir"></span>
<span data-value="6.93792E10" name="us"></span>
<span data-value="1485540" name="nv"></span>
<span data-value="-1.850961473789928" name="ur"></span>
<a href="/title/tt0068646/"> <img alt="The Godfather" height="67" src="https://m.media-amazon.com/images/M/MV5BM2MyNjYxNmUtYTAwNi00MTYxLWJmNWYtYzZlODY3ZTk3OTFlXkEyXkFqcGdeQXVyNzkwMjQ5NzM@._V1_UY67_CR1,0,45,67_AL_.jpg" width="45"/>
</a> </td>
<td class="titleColumn">
2.
<a href="/title/tt0068646/" title="Francis Ford Coppola (dir.), Marlon Brando, Al Pacino">The Godfather</a>
<span class="secondaryInfo">(1972)</span>
</td>
<td class="ratingColumn imdbRating">
<strong title="9.1 based on 1,485,540 user ratings">9.1</strong>
</td>
<td class="ratingColumn">
<div class="seen-widget seen-widget-tt0068646 pending" data-titleid="tt0068646">
<div class="boundary">
<div class="popover">
<span class="delete"> </span><ol><li>1<li>2<li>3<li>4<li>5<li>6<li>7<li>8<li>9<li>10</li>0</li></li></li></li&td;</li></li></li></li></li></ol> </div>
</div>
<div class="inline">
<div class="pending"></div>
<div class="unseeable">NOT YET RELEASED</div>
<div class="unseen"> </div>
<div class="rating"></div>
<div class="seen">Seen</div>
</div>
</div>
</td>
<td class="watchlistColumn">
<div class="wlb_ribbon" data-recordmetrics="true" data-tconst="tt0068646"></div>
</td>
</tr>
>>>
>>> a_string.find_parents('td')
[<td class="titleColumn">
2.
<a href="/title/tt0068646/" title="Francis Ford Coppola (dir.), Marlon Brando, Al Pacino">The Godfather</a>
<span class="secondaryInfo">(1972)</span>
</td>]
Ada delapan metode serupa lainnya -
find_next_siblings(name, attrs, string, limit, **kwargs)
find_next_sibling(name, attrs, string, **kwargs)
find_previous_siblings(name, attrs, string, limit, **kwargs)
find_previous_sibling(name, attrs, string, **kwargs)
find_all_next(name, attrs, string, limit, **kwargs)
find_next(name, attrs, string, **kwargs)
find_all_previous(name, attrs, string, limit, **kwargs)
find_previous(name, attrs, string, **kwargs)
Dimana,
find_next_siblings() dan find_next_sibling() metode akan mengulangi semua saudara dari elemen yang muncul setelah yang sekarang.
find_previous_siblings() dan find_previous_sibling() metode akan mengulangi semua saudara yang datang sebelum elemen saat ini.
find_all_next() dan find_next() metode akan mengulangi semua tag dan string yang muncul setelah elemen saat ini.
find_all_previous dan find_previous() metode akan mengulang semua tag dan string yang ada sebelum elemen saat ini.
Pemilih CSS
Pustaka BeautifulSoup untuk mendukung pemilih CSS yang paling umum digunakan. Anda dapat mencari elemen menggunakan pemilih CSS dengan bantuan metode select ().
Berikut beberapa contoh -
>>> soup.select('title')
[<title>IMDb Top 250 - IMDb</title>, <title>IMDb Top Rated Movies</title>]
>>>
>>> soup.select("p:nth-of-type(1)")
[<p>The Top Rated Movie list only includes theatrical features.</p>, <p> class="imdb-footer__copyright _2-iNNCFskmr4l2OFN2DRsf">© 1990-2019 by IMDb.com, Inc.</p>]
>>> len(soup.select("p:nth-of-type(1)"))
2
>>> len(soup.select("a"))
609
>>> len(soup.select("p"))
2
>>> soup.select("html head title")
[<title>IMDb Top 250 - IMDb</title>, <title>IMDb Top Rated Movies</title>]
>>> soup.select("head > title")
[<title>IMDb Top 250 - IMDb</title>]
#print HTML code of the tenth li elemnet
>>> soup.select("li:nth-of-type(10)")
[<li class="subnav_item_main">
<a href="/search/title?genres=film_noir&sort=user_rating,desc&title_type=feature&num_votes=25000,">Film-Noir
</a> </li>]