beautifulsoup
위치 요소
수색…
BeautifulSoup에서 요소 뒤에 텍스트 찾기
다음 HTML을 가지고 있다고 가정 해보십시오.
<div>
<label>Name:</label>
John Smith
</div>
그리고 label
요소 다음에 "John Smith"라는 텍스트를 찾아야합니다.
이 경우 텍스트로 label
요소를 찾은 다음 .next_sibling
속성 을 사용할 .next_sibling
있습니다 .
from bs4 import BeautifulSoup
data = """
<div>
<label>Name:</label>
John Smith
</div>
"""
soup = BeautifulSoup(data, "html.parser")
label = soup.find("label", text="Name:")
print(label.next_sibling.strip())
John Smith
인쇄합니다.
CSS 선택기를 사용하여 BeautifulSoup의 요소 찾기
BeautifulSoup는 CSS 선택기에 대한 지원 이 제한적 이지만 가장 일반적으로 사용되는 CSS를 지원 합니다. select()
메서드를 사용 select()
여러 요소를 찾고 select_one()
을 사용하여 단일 요소를 찾습니다.
기본 예 :
from bs4 import BeautifulSoup
data = """
<ul>
<li class="item">item1</li>
<li class="item">item2</li>
<li class="item">item3</li>
</ul>
"""
soup = BeautifulSoup(data, "html.parser")
for item in soup.select("li.item"):
print(item.get_text())
인쇄물:
item1
item2
item3
댓글 찾기
에 주석을 찾으려면 BeautifulSoup
사용, text
(또는 string
로 유형을 검사 최신 버전의) 인수 Comment
:
from bs4 import BeautifulSoup
from bs4 import Comment
data = """
<html>
<body>
<div>
<!-- desired text -->
</div>
</body>
</html>
"""
soup = BeautifulSoup(data, "html.parser")
comment = soup.find(text=lambda text: isinstance(text, Comment))
print(comment)
desired text
인쇄 desired text
.
필터 함수
BeautifulSoup를 사용하면 find_all
및 유사한 함수에 함수를 제공하여 결과를 필터링 할 수 있습니다. 이는 코드 재사용 도구뿐만 아니라 복잡한 필터에도 유용 할 수 있습니다.
기본 사용법
요소를 인수로 취하는 함수를 정의하십시오. 인수가 일치하면 함수는 True
를 반환해야합니다.
def has_href(tag):
'''Returns True for tags with a href attribute'''
return bool(tag.get("href"))
soup.find_all(has_href) #find all elements with a href attribute
#equivilent using lambda:
soup.find_all(lambda tag: bool(tag.get("href")))
href
값으로 시작하지 않는 태그를 찾는 또 다른 예제
필터 함수에 추가 인수 제공
find_all
전달 된 함수는 하나의 인수만을 취할 수 있기 때문에 find_all
에서 사용할 함수를 생성하는 '함수 팩토리'를 만드는 것이 유용 할 find_all
있습니다. 이것은 태그 찾기 기능을보다 융통성있게 만드는데 유용합니다.
def present_in_href(check_string):
return lambda tag: tag.get("href") and check_string in tag.get("href")
soup.find_all(present_in_href("/partial/path"))
내부 태그 및 초기 선택된 태그의 속성 액세스
soup.find('div', class_='base class')
하여 html
을 선택한 것으로 가정 해 보겠습니다.
from bs4 import BeautifulSoup
soup = BeautifulSoup(SomePage, 'lxml')
html = soup.find('div', class_='base class')
print(html)
<div class="base class">
<div>Sample text 1</div>
<div>Sample text 2</div>
<div>
<a class="ordinary link" href="https://example.com">URL text</a>
</div>
</div>
<div class="Confusing class"></div>
'''
그리고 <a>
태그의 href
에 액세스하려면 다음과 같이하면됩니다.
a_tag = html.a
link = a_tag['href']
print(link)
https://example.com
이는 attrs
가 고유 한 식별 정보를 제공하지 않기 때문에 <a>
태그를 직접 선택할 수없는 경우 유용합니다. 구문 분석 된 페이지에 다른 "twin" <a>
태그가 있습니다. 그러나 필요한 <a>
가 포함 된 상위 태그를 고유하게 선택할 수 있습니다.
일련의 페이지에서 선택적 요소 및 / 또는 해당 속성 수집
페이지 수를 파싱하고 paticular 페이지의 선택적 요소 (한 페이지에 표시 할 수 있고 다른 페이지에 없을 수도 있음)의 값을 수집하려는 경우를 생각해 봅시다.
또한 예를 들어, 요소 자체는 페이지의 가장 일반적인 요소 입니다. 즉, 특정 특성으로 인해 해당 요소 를 고유하게 찾을 수 없습니다. 그러나 부모 요소를 올바르게 선택할 수 있고 각 중첩 수준에서 원하는 요소의 순서 번호 를 알고 있음을 알 수 있습니다.
from bs4 import BeautifulSoup
soup = BeautifulSoup(SomePage, 'lxml')
html = soup.find('div', class_='base class') # Below it refers to html_1 and html_2
원하는 요소는 선택 사항이므로 html
에 대한 2 가지 상황이있을 수 있습니다.
html_1 = '''
<div class="base class"> # №0
<div>Sample text 1</div> # №1
<div>Sample text 2</div> # №2
<div>!Needed text!</div> # №3
</div>
<div>Confusing div text</div> # №4
'''
html_2 = '''
<div class="base class"> # №0
<div>Sample text 1</div> # №1
<div>Sample text 2</div> # №2
</div>
<div>Confusing div text</div> # №4
'''
html_1
이 있으면 수집 할 수 있습니다 !Needed text!
태그 №3에서 이런 식으로 :
wanted tag = html_1.div.find_next_sibling().find_next_sibling() # this gives you whole tag №3
처음에는 №1 div
얻은 다음 2 번은 같은 중첩 수준에서 다음 div
로 №3으로 전환합니다.
wanted_text = wanted_tag.text # extracting !Needed text!
이 접근법의 유용성은 html_2
를 얻을 때 발생합니다. 접근 방식으로 오류가 발생하지 않으면 None
.
print(html_2.div.find_next_sibling().find_next_sibling())
None
여기에서 find_next_sibling()
사용하는 것은 중첩 수준에 따라 요소 검색을 제한하기 때문에 중요합니다. find_next()
를 사용하면 №4 태그가 수집되어 원하지 않습니다.
print(html_2.div.find_next().find_next())
<div>Confusing div text</div>
또한 find_previous_sibling()
및 find_previous()
를 탐색하여 정반대로 사용할 수 있습니다.
설명 된 모든 함수에는 첫 번째 태그뿐만 아니라 모든 태그를 포착하기위한 여러 가지 변형이 있습니다.
find_next_siblings()
find_previous_siblings()
find_all_next()
find_all_previous()