아름다운 수프-나무 찾기
파스 트리를 검색 할 수있는 Beautifulsoup 메서드가 많이 있습니다. 가장 일반적이고 사용되는 두 가지 메서드는 find () 및 find_all ()입니다.
find () 및 find_all ()에 대해 이야기하기 전에 이러한 메서드에 전달할 수있는 여러 필터의 몇 가지 예를 살펴 보겠습니다.
필터 종류
이러한 메서드에 전달할 수있는 다른 필터가 있으며 이러한 필터를 검색 API 전체에서 반복해서 사용하므로 이러한 필터를 이해하는 것이 중요합니다. 태그의 이름, 속성, 문자열 텍스트 또는 이들을 혼합하여 이러한 필터를 사용할 수 있습니다.
문자열
가장 간단한 필터 유형 중 하나는 문자열입니다. 검색 방법과 Beautifulsoup에 문자열을 전달하면 해당 문자열에 대한 일치가 수행됩니다.
아래 코드는 문서의 모든 <p> 태그를 찾을 수 있습니다.
>>> 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>]
정규식
주어진 문자열 / 태그로 시작하는 모든 태그를 찾을 수 있습니다. 그 전에 정규 표현식을 사용하기 위해 re 모듈을 가져와야합니다.
>>> 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>]
명부
목록을 제공하여 찾을 여러 태그를 전달할 수 있습니다. 아래 코드는 모든 <b> 및 <pre> 태그를 찾습니다-
>>> markup.find_all(['pre', 'b'])
[<pre>Programming Languages are:</pre>, <b>Java, Python, Cplusplus</b>]
진실
True는 찾을 수있는 모든 태그를 반환하지만 자체적으로 문자열은 반환하지 않습니다.
>>> 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>]
위의 수프에서 태그 만 반환하려면-
>>> for tag in markup.find_all(True):
(tag.name)
'html'
'body'
'p'
'p'
'pre'
'p'
'b'
find_all ()
find_all을 사용하여 페이지 응답에서 특정 태그의 모든 발생을 추출 할 수 있습니다.
통사론
find_all(name, attrs, recursive, string, limit, **kwargs)
IMDB-“최고 평점 영화”에서 흥미로운 데이터를 추출해 보겠습니다.
>>> 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
위에서 우리는 find_all이 우리가 정의한 검색 기준과 일치하는 모든 항목을 제공하는 것을 볼 수 있습니다. find_all ()과 함께 사용할 수있는 모든 필터는 find () 및 find_parents () 또는 find_siblings ()와 같은 다른 검색 방법과 함께 사용할 수 있습니다.
찾기()
위에서 보았 듯이 find_all ()은 모든 내용을 찾기 위해 전체 문서를 스캔하는 데 사용됩니다. 요구 사항은 하나의 결과 만 찾는 것입니다. 문서에 <body> 태그가 하나만 포함되어 있다는 것을 알고 있다면 전체 문서를 검색하는 데 시간 낭비입니다. 한 가지 방법은 매번 limit = 1로 find_all ()을 호출하는 것입니다. 그렇지 않으면 find () 메서드를 사용하여 똑같이 할 수 있습니다.
통사론
find(name, attrs, recursive, string, **kwargs)
따라서 두 가지 다른 방법 아래에서 동일한 출력을 제공합니다.
>>> soup.find_all('title',limit=1)
[<title>IMDb Top 250 - IMDb</title>]
>>>
>>> soup.find('title')
<title>IMDb Top 250 - IMDb</title>
위의 출력에서 find_all () 메서드는 단일 항목을 포함하는 목록을 반환하는 반면 find () 메서드는 단일 결과를 반환합니다.
find ()와 find_all () 메서드의 또 다른 차이점은-
>>> soup.find_all('h2')
[]
>>>
>>> soup.find('h2')
soup.find_all () 메서드가 아무것도 찾을 수 없으면 빈 목록을 반환하고 find ()는 None을 반환합니다.
find_parents () 및 find_parent ()
트리를 순회하는 find_all () 및 find () 메소드와 달리 태그의 하위 항목을 보면 find_parents () 및 find_parents methods ()는 그 반대를 수행하며 트리를 위쪽으로 순회하고 태그 (또는 문자열의) 부모를 봅니다.
통사론
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>]
8 개의 다른 유사한 방법이 있습니다-
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)
어디,
find_next_siblings() 과 find_next_sibling() 메소드는 현재 요소 뒤에 오는 요소의 모든 형제를 반복합니다.
find_previous_siblings() 과 find_previous_sibling() 메소드는 현재 요소 앞에 오는 모든 형제를 반복합니다.
find_all_next() 과 find_next() 메소드는 현재 요소 뒤에 오는 모든 태그와 문자열을 반복합니다.
find_all_previous 과 find_previous() 메소드는 현재 요소 앞에 오는 모든 태그와 문자열을 반복합니다.
CSS 선택자
가장 일반적으로 사용되는 CSS 선택기를 지원하는 BeautifulSoup 라이브러리. select () 메서드의 도움으로 CSS 선택기를 사용하여 요소를 검색 할 수 있습니다.
다음은 몇 가지 예입니다.
>>> 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- 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>]